在xslt中查找父元素的previous-sibling

时间:2017-01-06 12:16:14

标签: xslt xslt-1.0 xslt-2.0

         <p>
            <p1>c</p1>
            <a languageCode="en">a1</a>
            <a languageCode="de">a2</a>
             <ca>
                <cc>056</cc>
                <cs>BE-VAN</cs>
                <cs>BG-VLI</cs>
                <cs>BG-VLI</cs>
            </ca>
            <ca>
                <cc>056</cc>
                <cs>BE-VAN</cs>
                <cs>BG-VLI</cs>
                <cs>BG-VLI</cs>
            </ca>
        </p>

我试过这不起作用:

<xsl:for-each select="p/ca/*">
    <xsl:if test="not(preceding-sibling::*[1]/name() = local-name())">
            <precedingParent n="{preceding-sibling::*[1]/parent::*/name()}"></precedingParent>
    </xsl:if>
</xsl:for-each>

但是预料到了 输出应该是:

<precedingParent n="a"></precedingParent>

我在ca中循环,例如在第一次出现cs时 如果想为元素cs找到父ca的父级的前一个兄弟?我该怎么做?

1 个答案:

答案 0 :(得分:2)

您要查找的表达式为../preceding-sibling::*[1]/name()。例如,

    <xsl:for-each select="p/ca/*">
        <xsl:if test="not(preceding-sibling::*[1]/name() = local-name())">
            <precedingParent n="{../preceding-sibling::*[1]/name()}"></precedingParent>
        </xsl:if>
    </xsl:for-each>

请注意,name(../preceding-sibling::*[1])也可以使用(在XSLT 1.0和XSLT 2.0中)。

另一方面,通过嵌套循环可以稍微提高效率,并在选择子元素之前获取前面的值,以保存每次都必须重新计算:

    <xsl:for-each select="p/ca">
        <xsl:variable name="precedingParent" select="name(preceding-sibling::*[1])" />
        <xsl:for-each select="*">
            <xsl:if test="not(preceding-sibling::*[1]/name() = local-name())">
                <precedingParent n="{$precedingParent}"></precedingParent>
            </xsl:if>
        </xsl:for-each>        
    </xsl:for-each>