在 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>      

相关内容

  • 没有找到相关文章

最新更新