关于xslt:XSL增量模板参数

XSL increment template parameter

输入:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
    <root>
    <trip>
        <ID>3295</ID>        
        <ordini>
            <NR>821321</NR>
            <!-- some info -->
        </ordini>
        <ordini>
             <NR>234</NR>
            <!-- some info -->
        </ordini>
</trip>
<trip>
        <ID>23</ID>      
        <ordini>
         <NR>2321</NR>
            <!-- some info -->
        </ordini>
        <ordini>
           <NR>999</NR>
            <!-- some info -->
        </ordini>
        <ordini>
         <NR>232132131</NR>
            <!-- some info -->
        </ordini>
    </trip>
    </root>

XSL:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    version="1.0">
    <xsl:output method="xml" indent="yes" />
    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates/>
        </xsl:copy>
    </xsl:template>  
    <xsl:template name="set-row">      
        <xsl:param name="runningtot"/>
        <xsl:param name="node"/>      
             <xsl:value-of select="$runningtot + 1"/>
             <xsl:if test="$node/following-sibling::ordini">
             <xsl:call-template name="set-row">            
                <xsl:with-param name="runningtot" select="$runningtot + 1"/>
                <xsl:with-param name="node" select="$node/following-sibling::ordini[1]"/>
            </xsl:call-template>
        </xsl:if>
    </xsl:template>
    <xsl:template match="ordini">
    <xsl:for-each select="//ordini">
        <ordini>
            <NR>
                 <xsl:call-template name="set-row">              
                <xsl:with-param name="runningtot" select="0"/>
                <xsl:with-param name="node" select="ordini"/>
            </xsl:call-template>
            </NR>          
            <xsl:apply-templates/>
        </ordini>
        </xsl:for-each>
    </xsl:template>
</xsl:stylesheet>

期望的输出:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<root>
<trip>
        <ID>3295</ID>        
        <ordini>
        <NR>1</NR>
            <!-- some info -->
        </ordini>
        <ordini>
        <NR>2</NR>
            <!-- some info -->
        </ordini>
</trip>
<trip>
        <ID>23</ID>      
        <ordini>
        <NR>1</NR>
            <!-- some info -->
        </ordini>
        <ordini>
        <NR>2</NR>
            <!-- some info -->
        </ordini>
        <ordini>
        <NR>3</NR>
            <!-- some info -->
        </ordini>
</trip>
</root>

基本上,我希望每个"ordini"标签都替换"NR"标签,我从 1 开始计数并递增父"trip"标签中的每个"ordini"标签。
在此处看到带有参数答案的此模板,该模板用于重复增量计数,但我无法使其对我有用。

感谢您的宝贵时间。


您有一个匹配 ordini 的模板,但随后您选择了文档中的所有 ordini 元素(因为这是 //ordini 选择的内容。

无论如何,在这种情况下有一个更简单的解决方案,而不是使用那个 set-row 模板。只需使用 xsl:number

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:output method="xml" indent="yes" />

    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates/>
        </xsl:copy>
    </xsl:template>  

    <xsl:template match="ordini">
        <ordini>
            <NR>
                 <xsl:number />
            </NR>          
            <xsl:apply-templates/>
        </ordini>
    </xsl:template>
</xsl:stylesheet>