请帮我解决增量问题。 有没有办法在不使用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 <= $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>
我通读互联网上的主题,似乎我被困住了。 请帮我。 附:对不起,很长的帖子。
答案 0 :(得分:0)
在我看来,一个奇怪的解决方案,但改变一行将会:
更改自:
<xsl:apply-templates select="root/line/test" />
要:
<xsl:apply-templates select="root/line[$counter]/test" />