我正在转换一个XML文档,我将其连接到两个标记的值:
<xsl:variable name="label">
<xsl:value-of select="label"/>
</xsl:variable>
<xsl:variable name="nr">
<xsl:value-of select="nr"/>
</xsl:variable>
<xsl:variable name="label_nr">
<xsl:value-of select="concat($label, ' ', $nr)"/>
</xsl:variable>
这适用于
<label>Article</label>
<nr>1</nr>
但我想要以下
<nr>First</nr>
<label>article</label>
生成“第一篇文章”,而不是“文章第一”。有没有一种简单的方法来区分XSLT中的标签顺序?
答案 0 :(得分:2)
为了让事情变得更简单,请尝试
<xsl:value-of select="concat((nr | label)[1], ' ', (nr | label)[2])"/>
这将连接元素集(nr | label)
的第一个和第二个元素。
请注意,(nr | label)
与(label | nr)
完全相同。集合中元素的顺序由XML中元素的顺序决定。
由于元素的原始顺序保留在此集合中,[1]
将选择树中的第一个元素和[2]
第二个元素。
答案 1 :(得分:1)
您应该可以使用轴来执行此操作:
<xsl:variable name="label_nr">
<xsl:choose>
<xsl:when test="name(nr/following-sibling::node()[1]) = 'label'"><xsl:value-of select="concat($nr, ' ', $label)"/></xsl:when>
<xsl:otherwise><xsl:value-of select="concat($label, ' ', $nr)"/></xsl:otherwise>
</xsl:choose>
</xsl:variable>
nr/following-sibling::node()[1]
正在从nr
节点选择下一个节点。我们需要[1]作为轴following-sibling::
将获取所有后续节点,因此[1]
只会让我们成为下一个节点。然后我们只使用name()
来获取元素的名称。希望很明显从那里发生了什么。
答案 2 :(得分:1)
在XSLT 2.0中,使用
<xsl:value-of select="label|nr"/>
就是这样。