2014-02-11 80 views
0

输入: -逻辑的的xsl:for不明确

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

其实这是输入结构,如果我们将循环这样

<xsl:for-each select="b/OrderLine/LineItem"> 

它应该只挑第一个Lineitem但它选择了输入中的所有行项目?任何人都可以在这里解释xsl:for-each的功能。

因为回路应适用于高达秩序本身,而是如何在上面写的代码是采摘在输入文件

回答

0

那么所有存在的行项目您的XPath说:“找我所有b节点,然后,内,所有OrderLine节点,然后内,所有LineItem节点所以,是的,这是预期的功能

旁注:你应该使用模板,而不是for-each(的ForEach就是一个开发人员,当他们来使用。 XSLT来自其他语言。)

如果您只希望每个OrderLine内的第一LineItem节点然后快速修改为:

<xsl:for-each select="b/OrderLine/LineItem[1]"> 

Playground

1

如果您仅在第一个LineItem之后,请勿使用xsl:for-each。使用

<xsl:template match="b/OrderLine/LineItem[1]"> 
    .... 
</xsl:template> 

顾名思义for-each,它处理每个匹配select表达

0

可以使用2 XSL项目:对,每个:

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

是非常具体到您的问题:

1)你还没有提到在哪里

<b> 

已经结束

2)如果您的XPath是选择所有节点的话,肯定这将是文档的根节点。

3)<xsl:for-each select="b/OrderLine/LineItem">

名称本身证明,该逻辑将被应用到 “EACH” 元素在您的xpath指向