Range 在xslt中按范围生成计数器

Range 在xslt中按范围生成计数器,range,counter,xslt-2.0,Range,Counter,Xslt 2.0,我正在尝试生成一个计数器,并使用xslt中的position()函数成功地实现了这一点 如何在-1001-9999范围内创建计数器,以便第一个计数器是1001而不是1 输入xml <ROOT> <Row> <Var>11</Var> </Row> <Row> <Var>11</Var> </Row> <Row> <Var>3</Var&

我正在尝试生成一个计数器,并使用xslt中的position()函数成功地实现了这一点

如何在-1001-9999范围内创建计数器,以便第一个计数器是1001而不是1

输入xml

<ROOT>
<Row>
    <Var>11</Var>
</Row>
<Row>
    <Var>11</Var>
</Row>
<Row>
    <Var>3</Var>
</Row>
<Row>
    <Var>43</Var>
</Row>
<Row>
    <Var>51</Var>
</Row>

11
11
3.
43
51

所需的o/p为

<ROOT>
<Row>
    <Var>11</Var>
    <seq>1001</seq>
</Row>
<Row>
    <Var>11</Var>
    <seq>1002</seq>
</Row>
<Row>
    <Var>3</Var>
    <seq>1003</seq>
</Row>
<Row>
    <Var>43</Var>
    <seq>1004</seq>
</Row>
<Row>
    <Var>51</Var>
    <seq>1005</seq>
</Row>
..

11
1001
11
1002
3.
1003
43
1004
51
1005
..

谢谢,
Vicky

好吧,XPath2和更高版本允许您编写
1000到9999
来创建这些数字的序列。我不确定这是否适合您的问题,因为您没有提供任何上下文,如您所拥有的输入和所需的输出。在XSLT 3(不是2)中,经常用于计数或编号的
xsl:number
元素也有一个
start at
属性,请参阅

由于您似乎希望从输入中对元素进行编号,我认为正确的方法是使用
xsl:number
,因此使用XSLT 3您可以简单地执行以下操作:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    version="3.0">

  <xsl:mode on-no-match="shallow-copy"/>

  <xsl:output indent="yes"/>

  <xsl:template match="Row">
      <xsl:copy>
          <xsl:apply-templates/>
          <seq>
              <xsl:number start-at="1001"/>
          </seq>
      </xsl:copy>
  </xsl:template>

</xsl:stylesheet>

我认为在你的用例中使用
to
表达式是没有意义的,如果你想创建一些新元素,比如

  <xsl:template match="body">
      <xsl:copy>
          <xsl:for-each select="1001 to 1100">
              <seq>
                  <xsl:value-of select="."/>
              </seq>
          </xsl:for-each>
      </xsl:copy>
  </xsl:template>

好吧,XPath2和更高版本允许您编写
1000到9999
来创建这些数字的序列。我不确定这是否适合您的问题,因为您没有提供任何上下文,如您所拥有的输入和所需的输出。在XSLT 3(不是2)中,经常用于计数或编号的
xsl:number
元素也有一个
start at
属性,请参阅

由于您似乎希望从输入中对元素进行编号,我认为正确的方法是使用
xsl:number
,因此使用XSLT 3您可以简单地执行以下操作:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    version="3.0">

  <xsl:mode on-no-match="shallow-copy"/>

  <xsl:output indent="yes"/>

  <xsl:template match="Row">
      <xsl:copy>
          <xsl:apply-templates/>
          <seq>
              <xsl:number start-at="1001"/>
          </seq>
      </xsl:copy>
  </xsl:template>

</xsl:stylesheet>

我认为在你的用例中使用
to
表达式是没有意义的,如果你想创建一些新元素,比如

  <xsl:template match="body">
      <xsl:copy>
          <xsl:for-each select="1001 to 1100">
              <seq>
                  <xsl:value-of select="."/>
              </seq>
          </xsl:for-each>
      </xsl:copy>
  </xsl:template>

我实现了以下要求:

<xsl:template match="/">
    <ROOT>
        <xsl:apply-templates />
    </ROOT>
</xsl:template>
<xsl:template match="ROOT/Row"> 
    <Row>
        <Var>
            <xsl:value-of select="Var"/>
        </Var>
        <seq>
            <xsl:value-of select="1000 + position()" />
        </seq>          
    </Row>      
</xsl:template>

我实现了以下要求:

<xsl:template match="/">
    <ROOT>
        <xsl:apply-templates />
    </ROOT>
</xsl:template>
<xsl:template match="ROOT/Row"> 
    <Row>
        <Var>
            <xsl:value-of select="Var"/>
        </Var>
        <seq>
            <xsl:value-of select="1000 + position()" />
        </seq>          
    </Row>      
</xsl:template>

注意,使用XSLT 3.0可以

<seq>
    <xsl:number start-at="1001" />
</seq> 

注意,使用XSLT 3.0可以

<seq>
    <xsl:number start-at="1001" />
</seq> 


我已经实现了如下所示的req,我很想知道您所指的xpath2.0表达式。我已经实现了如下所示的req,我很想知道您所指的xpath2.0表达式。