1

具有这样的 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 节点匹配的模板中,我想用当前的 ShippingMethodId 循环 LineItems。像这样:

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

但这给了我每个 Shipment 下的所有 LineItems。为特定 LineItem 节点调用模板的正确方法是什么?

4

1 回答 1

1

用于current()指向循环外的上下文。循环内部.指向lopp 的当前元素的上下文。像这样:

<xsl:for-each select="//LineItems/LineItem[ShippingMethodId=current()/ShippingMethodId]">

此外,感觉就像您可以通过“匹配”完成所有您需要的事情,而无需调用函数之类的模板。让我们更多地了解您要完成的工作,我们可能会推荐一种更符合意识形态的方式来实现目标。例如,如果您需要按这些ShippingMethodIds 进行分组,您可以使用Muenchian 方法

于 2012-05-09T10:21:13.977 回答