2013-04-29 56 views
0

這裏是一個XML例子:XSL複製的通過條件的for-each

<OUT> 
    <Header> 
     <LineType>H</LineType> 
     <DocumentType>OUT</DocumentType> 
     <ClientCode>177</ClientCode> 
     <OrderNumber>SP03038181</OrderNumber> 
     <PayerINN>2636052865</PayerINN> 
     <TotalItems>3</TotalItems> 
    </Header> 
    <Line> 
     <LineType>I</LineType> 
     <Unit>PCE</Unit> 
     <OrderNumber>SP03038181</OrderNumber> 
     <Party>A289217</Party> 
     <field>20171031</field> 
    </Line> 
    <Line> 
     <LineType>I</LineType> 
     <OrderNumber>SP03038181</OrderNumber> 
     <Party>0911082</Party> 
     <field>20150731</field> 
    </Line> 
    <Header> 
     <LineType>H</LineType> 
     <DocumentType>OUT</DocumentType> 
     <ClientCode>177</ClientCode> 
     <OrderNumber>SP03038322</OrderNumber> 
    </Header> 
    <Line> 
     <LineType>I</LineType> 
     <OrderNumber>SP03038322</OrderNumber> 
     <Party>Z10208</Party> 
     <field>20141231</field> 
    </Line> 
</OUT> 

這裏是XSLT代碼:

<xsl:for-each select="*/Header">     
      <part> 
       <header></header>      
       <content> 
        <OUT> 
         <xsl:copy-of select="."/> 
         <xsl:copy-of select="../Line[OrderNumber = ./OrderNumber]"/> 
        </OUT> 
       </content>     
      </part> 
</xsl:for-each> 

問題是我不能複製所有Line節點它們與當前的Header節點具有相同的訂單號。

<xsl:copy-of select="../Line[OrderNumber = ./OrderNumber]"/> 

不起作用,它複製所有Line節點。

回答

1

嘛謂語Line[OrderNumber = ./OrderNumber]相同Line[OrderNumber = OrderNumber]。我想一開始你想Line[current()/OrderNumber = OrderNumber],但我強烈建議使用鍵或for-each-group來查找匹配的項目。

1

試圖改變拷貝的線路到:

<xsl:copy-of select="../Line[OrderNumber = current()/OrderNumber]"/> 

這將選擇行條目與訂單號碼是相同的current()

1

試試這個:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="html" indent="yes" omit-xml-declaration="yes"/> 
    <xsl:output indent="yes"/> 
    <xsl:strip-space elements="*"/> 
    <xsl:template match="/"> 
    <xsl:for-each select="*/Header"> 
     <xsl:variable name="orderNumber" select="OrderNumber"/> 
     <part> 
     <header></header>      
     <content> 
      <OUT> 
      <xsl:copy-of select="."/> 
      <xsl:copy-of select="//Line[OrderNumber = $orderNumber]"/> 
      </OUT> 
     </content>     
     </part> 
    </xsl:for-each> 
    </xsl:template> 
</xsl:stylesheet> 

得到輸出:

<part> 
    <header></header> 
    <content> 
     <OUT> 
     <Header> 
      <LineType>H</LineType> 
      <DocumentType>OUT</DocumentType> 
      <ClientCode>177</ClientCode> 
      <OrderNumber>SP03038181</OrderNumber> 
      <PayerINN>2636052865</PayerINN> 
      <TotalItems>3</TotalItems> 
     </Header> 
     <Line> 
      <LineType>I</LineType> 
      <Unit>PCE</Unit> 
      <OrderNumber>SP03038181</OrderNumber> 
      <Party>A289217</Party> 
      <field>20171031</field> 
     </Line> 
     <Line> 
      <LineType>I</LineType> 
      <OrderNumber>SP03038181</OrderNumber> 
      <Party>0911082</Party> 
      <field>20150731</field> 
     </Line> 
     </OUT> 
    </content> 
</part> 
<part> 
    <header></header> 
    <content> 
     <OUT> 
     <Header> 
      <LineType>H</LineType> 
      <DocumentType>OUT</DocumentType> 
      <ClientCode>177</ClientCode> 
      <OrderNumber>SP03038322</OrderNumber> 
     </Header> 
     <Line> 
      <LineType>I</LineType> 
      <OrderNumber>SP03038322</OrderNumber> 
      <Party>Z10208</Party> 
      <field>20141231</field> 
     </Line> 
     </OUT> 
    </content> 
</part>