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

私の見解では奇妙な解決策ですが、1行を変更するだけで済みます:

から変更する:

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

に:

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