首页 > 解决方案 > 如何在 XSLT 中创建一个增加 1 个 foreach 循环的计数器,我已经嵌套了 foreach 循环

问题描述

<xsl:template match="Quote">
<Quote>    

        <xsl:for-each select="Configuration"> 
            <ConfigItem>
                <xsl:variable name="GeneratedStructure">
                <xsl:variable name="ConfigurationPos" select="position()+10"/> 
                <configurationPostion><xsl:value-of select = "$ConfigurationPos" /> </configurationPostion> 
                <!--  <VariableValue><xsl:value-of select="$ConfigurationPos"/></VariableValue>-->
                <Vendor><xsl:value-of select="Vendor" /></Vendor>
                <PriceListID><xsl:value-of select="PriceListID" /></PriceListID>
                <Source><xsl:value-of select="Source" /></Source>
                <xsl:for-each select="ProductLineItem">
                    <ProductLineItem>
                        <xsl:variable name="ProductPos" select="$ConfigurationPos+(position()*10)"/>
                        <ProductPostionNumber><xsl:value-of select = "$ProductPos" /></ProductPostionNumber>
                    </ProductLineItem>   
                </xsl:for-each>
                </xsl:variable>  
                <xsl:variable name="SubtotalPos" select="max($GeneratedStructure/ProductLineItem/ProductPostionNumber)"/>
                <xsl:copy-of select="$GeneratedStructure"/> 
                <xsl:variable name="max">
                    <xsl:for-each select="$GeneratedStructure/ProductLineItem/ProductPostionNumber">
                        <xsl:sort select="." data-type="number" order="descending"/>

                    </xsl:for-each>
                </xsl:variable>
                <subMax><xsl:value-of select = "number($max)+10" /></subMax>
            </ConfigItem>
        </xsl:for-each>  
</Quote>
</xsl:template>

如何在 XSLT 中创建一个增加 1 个 foreach 循环的计数器,我在 foreach 循环中有一个 foreach 循环,我已经编写了它,但是一旦父 foreach 循环开始进行下一次迭代,计数器设置为零

标签: xmlxslt

解决方案


如果 - 看起来 - 您想使用相同的序列对父级和子级进行编号,请尝试使用xsl:number. 例如:

XML

<Quote>
   <Configuration>
      <RowID>12333dddd</RowID>
      <ProductLineItem>
         <LineNumber>1.0.1</LineNumber>
      </ProductLineItem>
      <ProductLineItem>
         <LineNumber>2.0.1</LineNumber>
      </ProductLineItem>
   </Configuration>
   <Configuration>
      <RowID>12ss333dddd</RowID>
      <ProductLineItem>
         <LineId>5165550509</LineId>
      </ProductLineItem>
   </Configuration>
</Quote>

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>

<xsl:template match="Quote">
    <Quote>    
        <xsl:for-each select="Configuration"> 
            <ConfigItem>
                <configurationPostion>
                    <xsl:number count="Configuration | ProductLineItem" level="any"/>
                </configurationPostion>
                <xsl:for-each select="ProductLineItem">
                    <ProductPostionNumber>
                        <xsl:number count="Configuration | ProductLineItem" level="any"/>
                    </ProductPostionNumber>
                </xsl:for-each>
            </ConfigItem>
        </xsl:for-each>  
    </Quote>
</xsl:template>

</xsl:stylesheet>

结果

<?xml version="1.0" encoding="utf-16"?>
<Quote>
  <ConfigItem>
    <configurationPostion>1</configurationPostion>
    <ProductPostionNumber>2</ProductPostionNumber>
    <ProductPostionNumber>3</ProductPostionNumber>
  </ConfigItem>
  <ConfigItem>
    <configurationPostion>4</configurationPostion>
    <ProductPostionNumber>5</ProductPostionNumber>
  </ConfigItem>
</Quote>

推荐阅读