xsl:for的逻辑不清楚

时间:2014-02-11 10:05:01

标签: xml xslt xslt-1.0

输入: -

<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本身,但是上面编写的代码如何选择输入文件中存在的所有行项目

4 个答案:

答案 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]">

Playground

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