具有这样的XML结构:
<ContextDoc>
<PurchaseOrder xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<OrderForms>
<OrderForm>
<Shipments>
<Shipment>
...
<ShippingMethodId>17995798-a2cc-43ad-81e8-bb932f6827e4</ShippingMethodId>
...
</Shipment>
<Shipment>
...
<ShippingMethodId>11223344-a2cc-11bc-25a7-aa345f6827e6</ShippingMethodId>
...
</Shipment>
</Shipments>
<LineItems>
<LineItem>
...
<ShippingMethodId>17995798-a2cc-43ad-81e8-bb932f6827e4</ShippingMethodId>
...
</LineItem>
<LineItem>
...
<ShippingMethodId>17995798-a2cc-43ad-81e8-bb932f6827e4</ShippingMethodId>
...
</LineItem>
<LineItem>
...
<ShippingMethodId>11223344-a2cc-11bc-25a7-aa345f6827e6</ShippingMethodId>
...
</LineItem>
</LineItems>
</OrderForm>
</OrderForms>
</PurchaseOrder>
</ContextDoc>
从匹配每个Shipment节点的模板中,我想将LineItems与当前的ShippingMethodId循环。像这样:
<xsl:template match="Shipment">
<xsl:for-each select="//LineItems/LineItem[ShippingMethodId=./ShippingMethodId]">
<xsl:call-template name="LineItem">
</xsl:call-template>
</xsl:for-each>
</xsl:Template>
但是这给了我每个货件下的所有LineItems。为特定LineItem节点调用模板的正确方法是什么?
答案 0 :(得分:1)
使用current()
指向循环外的上下文。循环内的.
指向lopp当前元素的上下文。像这样:
<xsl:for-each select="//LineItems/LineItem[ShippingMethodId=current()/ShippingMethodId]">
另外,感觉就像你可以通过“匹配”完成你所需要的一切而不需要调用像函数这样的模板。让我们更多地了解您想要实现的目标,我们可能会建议采用更加理想化的方式来实现目标。例如,如果您需要按ShippingMethodId
分组,则可以使用Muenchian method。