XSLT递增递归模板

时间:2013-06-18 06:15:13

标签: templates xslt recursion increment

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

以下是我要使用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>

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

<?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>

我通读互联网上的主题,似乎我被困住了。 请帮我。 附:对不起,很长的帖子。

1 个答案:

答案 0 :(得分:0)

在我看来,一个奇怪的解决方案,但改变一行将会:

更改自:

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

要:

<xsl:apply-templates select="root/line[$counter]/test" />
相关问题