输入: -
<b>
<cac:OrderLine>
<cac:LineItem>
<cbc:ID>1</cbc:ID>
<cbc:Quantity unitCode="KGM">100</cbc:Quantity>
<cbc:TotalTaxAmount currencyID="GBP">17.50</cbc:TotalTaxAmount>
<cac:Price>
<cbc:PriceAmount currencyID="GBP">100.00</cbc:PriceAmount>
<cbc:BaseQuantity unitCode="KGM">1</cbc:BaseQuantity>
</cac:Price>
</cac:LineItem>
</cac:OrderLine>
<cac:OrderLine>
<cac:LineItem>
<cbc:ID>5</cbc:ID>
<cbc:Quantity unitCode="KGM">300</cbc:Quantity>
<cbc:TotalTaxAmount currencyID="GBP">100.50</cbc:TotalTaxAmount>
<cac:Price>
<cbc:PriceAmount currencyID="GBP">2000.00</cbc:PriceAmount>
<cbc:BaseQuantity unitCode="KGM">52</cbc:BaseQuantity>
</cac:Price>
</cac:LineItem>
</cac:OrderLine>
实际上这是输入结构,如果我们像这样应用Loop
<xsl:for-each select="b/OrderLine/LineItem">
它应该只选择第一个Lineitem但它选择输入中存在的所有行项目?任何人都可以在这里解释xsl:for-each的功能。
因为The Loop应该应用于upto Order本身,但是上面编写的代码如何选择输入文件中存在的所有行项目
答案 0 :(得分:1)
如果您仅在第一个LineItem
之后,请不要使用xsl:for-each
。使用
<xsl:template match="b/OrderLine/LineItem[1]">
....
</xsl:template>
顾名思义for-each
,它处理与select
表达式匹配的每个项目
答案 1 :(得分:1)
非常具体您的问题:
1)你还没有提到哪里
<b>
正在结束
2)如果您的xpath正在选择所有节点,那么肯定它将是文档的根节点。
3)<xsl:for-each select="b/OrderLine/LineItem">
名称本身证明逻辑将应用于xpath所指向的“ EACH ”元素
答案 2 :(得分:0)
你的XPath说:“找到所有b
个节点,然后在所有OrderLine
节点内,然后在所有LineItem
个节点内找到。所以是的,这是预期的功能
旁注:您应该使用模板而不是for-each
。 (ForEach是开发人员从其他语言进入XSLT时使用的。)
如果您只需要每个LineItem
中的第一个OrderLine
节点,则可以快速修改:
<xsl:for-each select="b/OrderLine/LineItem[1]">
答案 3 :(得分:0)
您可以使用2 xsl:for-each:
<xsl:for-each select="b/OrderLine">
<!-- loop for each OrderLine -->
<xsl:for-each select="LineItem">
<!-- loop for each LineItem -->
</xsl:for-each>
</xsl:for-each>