连接以任意顺序出现的标记值(XSLT)

时间:2013-07-23 10:53:17

标签: xslt

我正在转换一个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中的标签顺序?

3 个答案:

答案 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"/>

就是这样。