XSLT 中嵌套 for-each 中的计数器

问题描述 投票:0回答:1

我想知道是否有任何方法可以在 XSL 转换中创建全局计数器..

情况是,目前我正在使用嵌套循环对订单和项目进行分组和循环。 这是一个示例输入:

<shipment>
    <shipmentid>1111222</shipmentid>
    <context>TEST</context>
    <delivery>
        <deliveryItem>
            <deliveryNumber>123</deliveryNumber>
            <deliveryDate>...</deliveryDate>
            <arrivalDate>...</arrivalDate>
            <customerOrderNumber>X999</customerOrderNumber>
            <customerItemCode>MC423</customerItemCode>
        </deliveryItem>
        <deliveryItem>
            <deliveryNumber>123</deliveryNumber>
            <deliveryDate>...</deliveryDate>
            <arrivalDate>...</arrivalDate>
            <customerOrderNumber>X877</customerOrderNumber>
            <customerItemCode>AY642</customerItemCode>
        </deliveryItem>
        <deliveryItem>
            <deliveryNumber>123</deliveryNumber>
            <deliveryDate>...</deliveryDate>
            <arrivalDate>...</arrivalDate>
            <customerOrderNumber>X315</customerOrderNumber>
            <customerItemCode>XY223</customerItemCode>
        </deliveryItem>
        <deliveryItem>
            <deliveryNumber>123</deliveryNumber>
            <deliveryDate>...</deliveryDate>
            <arrivalDate>...</arrivalDate>
            <customerOrderNumber>X315</customerOrderNumber>
            <customerItemCode>MM647</customerItemCode>
        </deliveryItem>
    </delivery>
</shipment>

预期的输出应该看起来像这样(不考虑任何细节):

<Order>
     <ControlHeader>HL</ControlHeader>
     <HL01>1</HL01>
</Order>
<Item>
    <ItemHierarchicalLevel>
       <ControlHeader>HL</ControlHeader>
       <HL01>2</HL01>
    </ItemHierarchicalLevel>
</Item>
<Item>
    <ItemHierarchicalLevel>
       <ControlHeader>HL</ControlHeader>
       <HL01>3</HL01>
    </ItemHierarchicalLevel>
</Item>
<Item>
    <ItemHierarchicalLevel>
       <ControlHeader>HL</ControlHeader>
       <HL01>4</HL01>
    </ItemHierarchicalLevel>
</Item>
<Order>
     <ControlHeader>HL</ControlHeader>
     <HL01>5</HL01>
</Order>
<Item>
    <ItemHierarchicalLevel>
       <ControlHeader>HL</ControlHeader>
       <HL01>6</HL01>
    </ItemHierarchicalLevel>
</Item>

目前这是我正在使用的嵌套 for-each 的结构,用于对订单和输出行详细信息进行分组:

<xsl:for-each-group select="/shipment/delivery/deliveryItem" group-by="customerOrderNumber">
  <tns:Order>
     <tns:ControlHeader>HL</tns:ControlHeader>
     <tns:HL01>
      
     </tns:HL01>
  </tns:Order>
  <xsl:for-each select="current-group()">
        <tns:Item>
            <tns:ItemHierarchicalLevel>
               <tns:ControlHeader>HL</tns:ControlHeader>
               <tns:HL01>
                  
               </tns:HL01>
            </tns:ItemHierarchicalLevel>
        </tns:Item>
    </xsl:for-each>
</xsl:for-each-group>

有没有什么方法可以创建一个可以在 HL01 字段中使用的数字序列,这对于订单和项目循环都是相同的,并且每次迭代都会继续递增而不会重置? 无法使用position()函数,因为它在每个循环中都是不同的值。

xml xslt soa
1个回答
0
投票

我想知道是否有任何方法可以在 XSL 转换中创建全局计数器

从稍微不同的层面回答这个问题:请记住,XSLT 是一种没有全局可变变量的函数式语言,因此“全局计数器”的概念对该语言来说是完全陌生的。因此,编号机制依赖于功能机制:

xsl:number
检查输入树中给定节点的位置,
position()
返回您正在处理的项目序列中项目的位置。所以你的问题的简单答案是“不”;您必须找到满足您要求的不同解决方案。

© www.soinside.com 2019 - 2024. All rights reserved.