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