<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的父级的前一个兄弟?我该怎么做?
答案 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>