0

请帮我解决增量问题。有没有办法在不使用 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>

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

4

1 回答 1

0

在我看来,这是一个奇怪的解决方案,但改变一行就可以了:

更改自:

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

到:

<xsl:apply-templates select="root/line[$counter]/test" />
于 2013-06-18T06:37:19.017 回答