XSL增量模板参数

时间:2018-07-30 14:30:47

标签: xslt

输入:

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

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

所需的输出:

<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”标签。 在此看到带有参数答案的模板,该模板用于重复的增量计数,但我无法使其正常工作。

谢谢您的时间。

1 个答案:

答案 0 :(得分:1)

您有一个与ordini相匹配的模板,但是随后您去选择了文档中的所有ordini元素(正是//ordini所选择的元素)。

在这种情况下,有一种比使用set-row模板简单得多的解决方案。只需使用xsl:number

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