xslt生成元素的当前位置和嵌套节点中next的值

时间:2018-12-10 08:20:05

标签: xml xslt xslt-2.0

考虑给定的代码:

<xsl:for-each select="$data/row">
    <xsl:if test="position() mod 2 = 1" >
        <xsl:element name="{current()}" >
            <xsl:value-of select="/*next element somehow*/" />
        </xsl:element>  
    </xsl:if>
</xsl:for-each>

当我知道这是我的foreach循环中的偶数元素时,如何获得下一个元素的值?

2 个答案:

答案 0 :(得分:2)

执行此操作...

<xsl:value-of select="following-sibling::row[1]" />

请注意,这实际上获得了当前行之后的第一个row元素,但不必紧挨着。例如,如果您的XML看起来像这样...

<data>
   <row>1</row>
   <extrarow>1</extrarow>
   <row>2</row>
</data>

然后,如果您位于第1行,并执行了上面的语句,它将获得第2行。如果您想获取extrarow(或紧随当前元素之后的任何元素),请执行此操作

<xsl:value-of select="following-sibling::*[1]" />

请注意,您可以将xsl:for-eachxsl:if合并为一个,就像这样:

<xsl:for-each select="$data/row[position() mod 2 = 1]" >

答案 1 :(得分:1)

另一种选择是改为使用位置分组:

      <xsl:for-each-group select="$data/row" group-adjacent="(position() - 1) idiv 2">
          <xsl:element name="{.}">
              <xsl:value-of select="current-group()[2]"/>
          </xsl:element>
      </xsl:for-each-group>

示例:https://xsltfiddle.liberty-development.net/jyH9rNu