1

我拼凑了一个例程,该例程将根据给定元素中的某些属性值生成过滤器属性值列表。功能是这样的:

<xsl:template name="have_arch_attrib">

    <!-- We only add a filter attribute IF there is a arch, condition or security attribute-->
    <xsl:choose>
        <xsl:when test=".[@arch] | .[@condition] | .[@security]">
            <xsl:attribute name="filter">
                <xsl:for-each select="@arch | @condition | @security ">

                    <!-- Need to check and convert semis to commas-->
                    <xsl:variable name="temp_string" select="."/>
                    <xsl:variable name="rep_string">
                        <xsl:value-of select="replace($temp_string, ';', ',')"/>
                    </xsl:variable>
                    <xsl:value-of select="$rep_string"/>


                    <!--<xsl:value-of select="." />-->
                    <xsl:if test="position() != last()">
                        <xsl:text>,</xsl:text>
                    </xsl:if>
                </xsl:for-each>
            </xsl:attribute>
        </xsl:when>
    </xsl:choose>
</xsl:template>

但是,对于某些元素,我需要检查该元素的父元素的属性。所以我像这样重写了上面的内容:

<xsl:template name="parent_has_arch_attrib">

    <!-- We only add a filter attribute IF there is a arch, condition or security attribute-->
    <xsl:choose>
        <xsl:when test="..[@arch] | ..[@condition] | ..[@security]">
            <xsl:attribute name="filter">
                <xsl:for-each select="..[@arch] | ..[@condition] | ..[@security] ">

                    <!-- Need to check and convert semis to commas-->
                    <xsl:variable name="temp_string" select="."/>
                    <xsl:variable name="rep_string">
                        <xsl:value-of select="replace($temp_string, ';', ',')"/>
                    </xsl:variable>
                    <xsl:value-of select="$rep_string"/>


                    <!--<xsl:value-of select="." />-->
                    <xsl:if test="position() != last()">
                        <xsl:text>,</xsl:text>
                    </xsl:if>
                </xsl:for-each>
            </xsl:attribute>
        </xsl:when>
    </xsl:choose>
</xsl:template>

我正在进入这个例行程序,但没有任何结果。我认为问题出在我通过 select="." 分配 temp_string 时。我相信这是当前的元素。如果我尝试 select=".." 这将为我提供所有属性值,而不仅仅是 for-each 循环正在处理的当前值。我可以在 for-each 循环中做这样的事情,还是我必须把它停下来?

谢谢你的帮助!

拉斯

4

1 回答 1

1

我认为你需要更换这条线......

<xsl:for-each select="..[@arch] | ..[@condition] | ..[@security] ">

用这条线代替

<xsl:for-each select="../@arch | ../@condition | ../@security ">

当您..[@arch] | ..[@condition] | ..[@security]所做的只是选择父节点(如果存在指定属性之一)时,实际上您是在尝试获取属性本身。

顺便说一句,你真的不需要在这里关心变量......

                <xsl:variable name="temp_string" select="."/>
                <xsl:variable name="rep_string">
                    <xsl:value-of select="replace($temp_string, ';', ',')"/>
                </xsl:variable>
                <xsl:value-of select="$rep_string"/>

您可以将其简化为以下内容:

<xsl:value-of select="replace(., ';', ',')"/>
于 2013-08-28T22:27:31.323 回答