2013-10-07 74 views
0

我有一個輸入XML這樣的 -行輸出XML來額外

<SAMPLE> 
<SAMPLE_ID>111</SAMPLE_ID> 
<ROWS> 
        <ROW ROW_TYPE="SPECIFICATION" ROW_ID="1">            
         <PRICE_PER_UNIT> 
          <AMOUNT SIGN="+" VAT="INCLUDED">1025.00</AMOUNT> 
          <AMOUNT SIGN="+" VAT="EXCLUDED">949.07</AMOUNT> 
         </PRICE_PER_UNIT> 
         <ROW_TOTAL> 
          <AMOUNT SIGN="+" VAT="INCLUDED">1025.00</AMOUNT> 
          <AMOUNT SIGN="+" VAT="EXCLUDED">949.07</AMOUNT> 
         </ROW_TOTAL>        
        </ROW> 
        <ROW ROW_TYPE="SPECIFICATION" ROW_ID="1">              
         <PRICE_PER_UNIT> 
          <AMOUNT SIGN="+" VAT="INCLUDED">67.00</AMOUNT> 
          <AMOUNT SIGN="+" VAT="EXCLUDED">53.60</AMOUNT> 
         </PRICE_PER_UNIT> 
         <ROW_TOTAL> 
          <AMOUNT SIGN="+" VAT="INCLUDED">67.00</AMOUNT> 
          <AMOUNT SIGN="+" VAT="EXCLUDED">53.60</AMOUNT> 
         </ROW_TOTAL>        
        </ROW> 
        <ROW ROW_TYPE="SPECIFICATION" ROW_ID="1">              
         <PRICE_PER_UNIT> 
          <AMOUNT SIGN="+" VAT="INCLUDED">3.00</AMOUNT> 
          <AMOUNT SIGN="+" VAT="EXCLUDED">2.40</AMOUNT> 
         </PRICE_PER_UNIT> 
         <ROW_TOTAL> 
          <AMOUNT SIGN="+" VAT="INCLUDED">3.00</AMOUNT> 
          <AMOUNT SIGN="+" VAT="EXCLUDED">2.40</AMOUNT> 
         </ROW_TOTAL>        
        </ROW> 
        <ROW ROW_TYPE="SUBTOTAL" ROW_ID="1">               
         <PRICE_PER_UNIT> 
          <AMOUNT SIGN="+" VAT="INCLUDED">1095.00</AMOUNT> 
          <AMOUNT SIGN="+" VAT="EXCLUDED">0.00</AMOUNT> 
         </PRICE_PER_UNIT> 
         <ROW_TOTAL> 
          <AMOUNT SIGN="+" VAT="INCLUDED">1095.00</AMOUNT> 
          <AMOUNT SIGN="+" VAT="EXCLUDED">0.00</AMOUNT> 
         </ROW_TOTAL>        
        </ROW> 
        <ROW ROW_TYPE="SPECIFICATION" ROW_ID="2">              
         <PRICE_PER_UNIT> 
          <AMOUNT SIGN="+" VAT="INCLUDED">315.00</AMOUNT> 
          <AMOUNT SIGN="+" VAT="EXCLUDED">291.67</AMOUNT> 
         </PRICE_PER_UNIT> 
         <ROW_TOTAL> 
          <AMOUNT SIGN="+" VAT="INCLUDED">630.00</AMOUNT> 
          <AMOUNT SIGN="+" VAT="EXCLUDED">583.33</AMOUNT> 
         </ROW_TOTAL>        
        </ROW> 
        <ROW ROW_TYPE="SPECIFICATION" ROW_ID="2">              
         <PRICE_PER_UNIT> 
          <AMOUNT SIGN="+" VAT="INCLUDED">30.00</AMOUNT> 
          <AMOUNT SIGN="+" VAT="EXCLUDED">24.00</AMOUNT> 
         </PRICE_PER_UNIT> 
         <ROW_TOTAL> 
          <AMOUNT SIGN="+" VAT="INCLUDED">60.00</AMOUNT> 
          <AMOUNT SIGN="+" VAT="EXCLUDED">48.00</AMOUNT> 
         </ROW_TOTAL>        
        </ROW> 
        <ROW ROW_TYPE="SPECIFICATION" ROW_ID="2">       
         <PRICE_PER_UNIT> 
          <AMOUNT SIGN="+" VAT="INCLUDED">10.00</AMOUNT> 
          <AMOUNT SIGN="+" VAT="EXCLUDED">8.00</AMOUNT> 
         </PRICE_PER_UNIT> 
         <ROW_TOTAL> 
          <AMOUNT SIGN="+" VAT="INCLUDED">20.00</AMOUNT> 
          <AMOUNT SIGN="+" VAT="EXCLUDED">16.00</AMOUNT> 
         </ROW_TOTAL>        
        </ROW> 
        <ROW ROW_TYPE="SPECIFICATION" ROW_ID="2">       
         <PRICE_PER_UNIT> 
          <AMOUNT SIGN="+" VAT="INCLUDED">175.00</AMOUNT> 
          <AMOUNT SIGN="+" VAT="EXCLUDED">140.00</AMOUNT> 
         </PRICE_PER_UNIT> 
         <ROW_TOTAL> 
          <AMOUNT SIGN="+" VAT="INCLUDED">350.00</AMOUNT> 
          <AMOUNT SIGN="+" VAT="EXCLUDED">280.00</AMOUNT> 
         </ROW_TOTAL>        
        </ROW> 
        <ROW ROW_TYPE="SUBTOTAL" ROW_ID="2">        
         <PRICE_PER_UNIT> 
          <AMOUNT SIGN="+" VAT="INCLUDED">530.00</AMOUNT> 
          <AMOUNT SIGN="+" VAT="EXCLUDED">0.00</AMOUNT> 
         </PRICE_PER_UNIT> 
         <ROW_TOTAL> 
          <AMOUNT SIGN="+" VAT="INCLUDED">1060.00</AMOUNT> 
          <AMOUNT SIGN="+" VAT="EXCLUDED">0.00</AMOUNT> 
         </ROW_TOTAL>        
        </ROW>     
       </ROWS> 

我的轉換是這樣的 -

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output omit-xml-declaration="yes" indent="yes"/> 
    <xsl:strip-space elements="*"/> 
    <xsl:key name="kRowById" match="ROW[not(@ROW_TYPE='SUBTOTAL' or @ROW_TYPE='MAIN' or @ROW_TYPE='COMMENT')]" use="@ROW_ID"/> 
    <xsl:template match="ROW[not(@ROW_TYPE='SPECIFICATION')]"> 
     <xsl:copy-of select="."/> 
     <xsl:copy-of select="key('kRowById', @ROW_ID)"/> 
    </xsl:template> 
    <xsl:template match="text()"/> 
</xsl:stylesheet> 

我的輸出結構來正確的,但只問題在於,這種邏輯在輸出xml中添加了額外的重複ROWS。 哪些不是必需的。對此有任何建議。

預期輸出 -

<SAMPLE> 
    <ROW ROW_TYPE="SUBTOTAL" ROW_ID="1">   
     <PRICE_PER_UNIT> 
      <AMOUNT SIGN="+" VAT="INCLUDED">1095.00</AMOUNT> 
      <AMOUNT SIGN="+" VAT="EXCLUDED">0.00</AMOUNT> 
     </PRICE_PER_UNIT> 
     <ROW_TOTAL> 
      <AMOUNT SIGN="+" VAT="INCLUDED">1095.00</AMOUNT> 
      <AMOUNT SIGN="+" VAT="EXCLUDED">0.00</AMOUNT> 
     </ROW_TOTAL>   
    </ROW> 
    <ROW ROW_TYPE="SPECIFICATION" ROW_ID="1">  
     <PRICE_PER_UNIT> 
      <AMOUNT SIGN="+" VAT="INCLUDED">1025.00</AMOUNT> 
      <AMOUNT SIGN="+" VAT="EXCLUDED">949.07</AMOUNT> 
     </PRICE_PER_UNIT> 
     <ROW_TOTAL> 
      <AMOUNT SIGN="+" VAT="INCLUDED">1025.00</AMOUNT> 
      <AMOUNT SIGN="+" VAT="EXCLUDED">949.07</AMOUNT> 
     </ROW_TOTAL>   
    </ROW> 
    <ROW ROW_TYPE="SPECIFICATION" ROW_ID="1">  
     <PRICE_PER_UNIT> 
      <AMOUNT SIGN="+" VAT="INCLUDED">67.00</AMOUNT> 
      <AMOUNT SIGN="+" VAT="EXCLUDED">53.60</AMOUNT> 
     </PRICE_PER_UNIT> 
     <ROW_TOTAL> 
      <AMOUNT SIGN="+" VAT="INCLUDED">67.00</AMOUNT> 
      <AMOUNT SIGN="+" VAT="EXCLUDED">53.60</AMOUNT> 
     </ROW_TOTAL>   
    </ROW> 
    <ROW ROW_TYPE="SPECIFICATION" ROW_ID="1">  
     <PRICE_PER_UNIT> 
      <AMOUNT SIGN="+" VAT="INCLUDED">3.00</AMOUNT> 
      <AMOUNT SIGN="+" VAT="EXCLUDED">2.40</AMOUNT> 
     </PRICE_PER_UNIT> 
     <ROW_TOTAL> 
      <AMOUNT SIGN="+" VAT="INCLUDED">3.00</AMOUNT> 
      <AMOUNT SIGN="+" VAT="EXCLUDED">2.40</AMOUNT> 
     </ROW_TOTAL>   
    </ROW> 
    <ROW ROW_TYPE="SUBTOTAL" ROW_ID="2">   
     <PRICE_PER_UNIT> 
      <AMOUNT SIGN="+" VAT="INCLUDED">530.00</AMOUNT> 
      <AMOUNT SIGN="+" VAT="EXCLUDED">0.00</AMOUNT> 
     </PRICE_PER_UNIT> 
     <ROW_TOTAL> 
      <AMOUNT SIGN="+" VAT="INCLUDED">1060.00</AMOUNT> 
      <AMOUNT SIGN="+" VAT="EXCLUDED">0.00</AMOUNT> 
     </ROW_TOTAL>   
    </ROW> 
    <ROW ROW_TYPE="SPECIFICATION" ROW_ID="2">  
     <PRICE_PER_UNIT> 
      <AMOUNT SIGN="+" VAT="INCLUDED">315.00</AMOUNT> 
      <AMOUNT SIGN="+" VAT="EXCLUDED">291.67</AMOUNT> 
     </PRICE_PER_UNIT> 
     <ROW_TOTAL> 
      <AMOUNT SIGN="+" VAT="INCLUDED">630.00</AMOUNT> 
      <AMOUNT SIGN="+" VAT="EXCLUDED">583.33</AMOUNT> 
     </ROW_TOTAL>   
    </ROW> 
    <ROW ROW_TYPE="SPECIFICATION" ROW_ID="2">  
     <PRICE_PER_UNIT> 
      <AMOUNT SIGN="+" VAT="INCLUDED">30.00</AMOUNT> 
      <AMOUNT SIGN="+" VAT="EXCLUDED">24.00</AMOUNT> 
     </PRICE_PER_UNIT> 
     <ROW_TOTAL> 
      <AMOUNT SIGN="+" VAT="INCLUDED">60.00</AMOUNT> 
      <AMOUNT SIGN="+" VAT="EXCLUDED">48.00</AMOUNT> 
     </ROW_TOTAL>   
    </ROW> 
    <ROW ROW_TYPE="SPECIFICATION" ROW_ID="2">  
     <PRICE_PER_UNIT> 
      <AMOUNT SIGN="+" VAT="INCLUDED">10.00</AMOUNT> 
      <AMOUNT SIGN="+" VAT="EXCLUDED">8.00</AMOUNT> 
     </PRICE_PER_UNIT> 
     <ROW_TOTAL> 
      <AMOUNT SIGN="+" VAT="INCLUDED">20.00</AMOUNT> 
      <AMOUNT SIGN="+" VAT="EXCLUDED">16.00</AMOUNT> 
     </ROW_TOTAL>   
    </ROW> 
    <ROW ROW_TYPE="SPECIFICATION" ROW_ID="2">  
     <PRICE_PER_UNIT> 
      <AMOUNT SIGN="+" VAT="INCLUDED">175.00</AMOUNT> 
      <AMOUNT SIGN="+" VAT="EXCLUDED">140.00</AMOUNT> 
     </PRICE_PER_UNIT> 
     <ROW_TOTAL> 
      <AMOUNT SIGN="+" VAT="INCLUDED">350.00</AMOUNT> 
      <AMOUNT SIGN="+" VAT="EXCLUDED">280.00</AMOUNT> 
     </ROW_TOTAL>   
    </ROW> 
</SAMPLE> 
+0

是否可以編輯您的問題,以顯示你的預期產出,否則它是不完全清楚你不希望看到哪些行。謝謝! –

+0

就我所見,您的預期輸出與您的問題中的XSLT生成的內容匹配..... –

+0

從我的xslt轉換中,ROW_TYPE =「SPECIFICATION」行即將增加。如果ROW_ID =「1」包含3次ROW_TYPE =「SPECIFICATION」,那麼我的轉換結果有9次。請再檢查一次。 – Kundan

回答

0

因爲你的問題只有一個「SAMPLE」的元素,它是不完全清楚你想怎麼它看起來與多個「SAMPLE」的元素,但我想你可能需要擴展您的xsl:鍵以包含SAMPLE_ID元素。

<xsl:key name="kRowById" 
     match="ROW[not(@ROW_TYPE='SUBTOTAL' or @ROW_TYPE='MAIN' or @ROW_TYPE='COMMENT')]" 
     use="concat(@ROW_ID, '|', ../../SAMPLE_ID)"/> 

因此,密鑰同時使用ROW_ID和SAMPLE_ID。請注意使用|字符作爲分隔符;它可以是任何字符,只要它不出現在ROW_ID或SAMPLE_ID中即可。

然後,在獲取SAMPLE的ROW元素時,在現有的xsl:copy中使用相同的鍵。

<xsl:copy-of select="key('kRowById', concat(@ROW_ID, '|', ../../SAMPLE_ID))"/> 

試試這個XSLT

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output omit-xml-declaration="yes" indent="yes"/> 
    <xsl:strip-space elements="*"/> 

    <xsl:key name="kRowById" match="ROW[not(@ROW_TYPE='SUBTOTAL' or @ROW_TYPE='MAIN' or @ROW_TYPE='COMMENT')]" use="concat(@ROW_ID, '|', ../../SAMPLE_ID)"/> 

    <xsl:template match="ROW[not(@ROW_TYPE='SPECIFICATION')]"> 
     <xsl:copy-of select="."/> 
     <xsl:copy-of select="key('kRowById', concat(@ROW_ID, '|', ../../SAMPLE_ID))"/> 
    </xsl:template> 

    <xsl:template match="text()"/> 

    <xsl:template match="SAMPLE"> 
     <xsl:copy> 
     <xsl:apply-templates /> 
     </xsl:copy> 
    </xsl:template> 
</xsl:stylesheet>