2013-06-18 115 views
0

请帮我解决增量问题。 有没有办法在不使用position(),number()或xpath表达式的情况下创建增量编号列表?XSLT增量递归模板

这里是我想用XSLT 1.0处理XML文档示例:

<?xml version="1.0" encoding="UTF-8"?> 
<root> 
    <text>a</text> 
    <text>b</text> 
    <text>c</text> 
    <line> 
     <test>5</test> 
     <test>6</test> 
    </line> 
    <line> 
     <test>7</test> 
     <test>8</test> 
    </line> 
    <line> 
     <test>9</test> 
     <test>10</test> 
    </line> 
    <line> 
     <test>11</test> 
     <test>12</test> 
    </line> 
</root> 

我想要得到的是一个增量的变量,即每个节点<line>增加。 这里是<pos>增量所需的输出:

<?xml version='1.0' ?> 
<line> 
    <line-item> 
    <pos>1</pos> 
    <value>5</value> 
    <value>6</value> 
    </line-item> 
    <line-item> 
    <pos>2</pos> 
    <value>7</value> 
    <value>8</value> 
    </line-item> 
    <line-item> 
    <pos>3</pos> 
    <value>9</value> 
    <value>10</value> 
    </line-item> 
    <line-item> 
    <pos>4</pos> 
    <value>11</value> 
    <value>12</value> 
    </line-item> 
</line> 

这里是我的样式表转换,我设法拿出这么远:

<?xml version='1.0'?> 
<xsl:stylesheet version="1.0" id="1" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="xml" indent="yes" /> 

<xsl:template match="/"> 
    <xsl:variable name="total_lines" select="count(root/line)" /> 

    <line> 
     <xsl:call-template name="iter"> 
      <xsl:with-param name="end" select="$total_lines" /> 
     </xsl:call-template> 
    </line> 
</xsl:template> 

<xsl:template name="iter"> 
    <xsl:param name="counter" select="1" /> 
    <xsl:param name="end" /> 

    <xsl:if test="$counter &lt;= $end"> 
     <line-item> 
      <pos> 
       <xsl:value-of select="$counter" /> 
      </pos> 

      <xsl:apply-templates select="root/line/test" /> 
     </line-item> 

     <xsl:call-template name="iter"> 
      <xsl:with-param name="counter" select="$counter + 1" /> 
      <xsl:with-param name="end" select="$end" /> 
     </xsl:call-template> 
    </xsl:if> 
</xsl:template> 

<xsl:template match="/root/line/test" > 
    <value> 
     <xsl:value-of select="." /> 
    </value> 
</xsl:template> 

</xsl:stylesheet> 

这里是实际输出,问题是它会在每个<line-item>节点中重复每个<value>,这不是我想要得到的结果。

<?xml version='1.0' ?> 
<line> 
    <line-item> 
    <pos>1</pos> 
    <value>5</value> 
    <value>6</value> 
    <value>7</value> 
    <value>8</value> 
    <value>9</value> 
    <value>10</value> 
    <value>11</value> 
    <value>12</value> 
    </line-item> 
    <line-item> 
    <pos>2</pos> 
    <value>5</value> 
    <value>6</value> 
    <value>7</value> 
    <value>8</value> 
    <value>9</value> 
    <value>10</value> 
    <value>11</value> 
    <value>12</value> 
    </line-item> 
    <line-item> 
    <pos>3</pos> 
    <value>5</value> 
    <value>6</value> 
    <value>7</value> 
    <value>8</value> 
    <value>9</value> 
    <value>10</value> 
    <value>11</value> 
    <value>12</value> 
    </line-item> 
    <line-item> 
    <pos>4</pos> 
    <value>5</value> 
    <value>6</value> 
    <value>7</value> 
    <value>8</value> 
    <value>9</value> 
    <value>10</value> 
    <value>11</value> 
    <value>12</value> 
    </line-item> 
</line> 

我通过互联网上的主题阅读,似乎我卡住了。 请帮帮我。 P.S.对不起,很长的职位。

回答

0

在我看来,一个陌生的解决方案,但改变一个行会做的事:

变化来自:

<xsl:apply-templates select="root/line/test" /> 

要:

<xsl:apply-templates select="root/line[$counter]/test" /> 
+0

哇,非常感谢,帮助! –