在 xslt 中查找父元素的前同级

Find preceding-sibling of the parent element in xslt

         <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 的第一次出现中 如果 a 想为元素 cs 找到父 ca 的父元素的前一个兄弟?我该怎么做?

您要查找的表达式是../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>