2014-02-14 30 views
0

我已經設置了一個與不同供應商的價格記錄name.I要採取的最新售價由date.Please供應商幫助選擇特定的XML記錄在XSLT的條件

<price_record> 
<price>222.5</price> 
<price_date>20060724</price_date> 
<price_supplier_name>ABC ></price_supplier_name> 
<seq_num>1</seq_num> 
</price_record> 

    <price_record> 
    <price>382.5</price> 
    <price_date>20080725</price_date>  
    <price_supplier_name>ABC </price_supplier_name> 
    <seq_num>2</seq_num> 
    </price_record> 

    <price_record> 
    <price>88.58</price> 
    <price_date>20060928</price_date>  
    <price_supplier_name>YZ ></price_supplier_name> 
    <seq_num>3</seq_num> 
    </price_rec 

    <price_record> 
    <price>78</price> 
    <price_date>20060928</price_date>  
    <price_supplier_name>YZ ></price_supplier_name> 
    <seq_num>3</seq_num> 
    </price_record> 

我想唯一每個供應商的價格(按最新日期)。

+1

你需要了解有關Muenchian分組。從這裏開始:http://www.jenitennison.com/xslt/grouping/muenchian.html –

回答

0

鑑於這種XML輸入

<?xml version="1.0" encoding="UTF-8"?> 
<root> 
    <price_record> 
     <price>222.5</price> 
     <price_date>20060724</price_date> 
     <price_supplier_name>ABC</price_supplier_name> 
     <seq_num>1</seq_num> 
    </price_record> 

    <price_record> 
     <price>382.5</price> 
     <price_date>20080725</price_date> 
     <price_supplier_name>ABC</price_supplier_name> 
     <seq_num>2</seq_num> 
    </price_record> 

    <price_record> 
     <price>88.58</price> 
     <price_date>20060927</price_date> 
     <price_supplier_name>YZ</price_supplier_name> 
     <seq_num>3</seq_num> 
    </price_record> 

    <price_record> 
     <price>78</price> 
     <price_date>20060928</price_date><!-- modified --> 
     <price_supplier_name>YZ</price_supplier_name> 
     <seq_num>3</seq_num> 
    </price_record> 
</root> 

和這個樣式表:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    version="1.0"> 

<xsl:template match="@*|node()"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*|node()"/> 
    </xsl:copy> 
</xsl:template> 
    <xsl:variable name="Suppliers"> 
     <xsl:for-each select="root/price_record/price_supplier_name"> 
      <xsl:value-of select="."/> 
      <xsl:text>,</xsl:text> 
     </xsl:for-each> 
    </xsl:variable> 

    <xsl:template match="root"> 
     <xsl:copy> 
      <xsl:for-each select="price_record"> 
       <xsl:choose> 
        <xsl:when test="position()!=last()"> 
         <xsl:choose> 
          <xsl:when test="following::price_record[price_date &gt; current()/price_date]/price_supplier_name = current()/price_supplier_name or preceding::price_record[price_date &gt; current()/price_date]/price_supplier_name = current()/price_supplier_name"/> 

          <xsl:otherwise> 
           <xsl:copy> 
            <xsl:apply-templates/> 
           </xsl:copy> 
          </xsl:otherwise> 
         </xsl:choose> 
        </xsl:when> 
        <xsl:otherwise> 
         <xsl:choose> 
          <xsl:when test="contains($Suppliers, current()/price_supplier_name) and preceding::price_record[price_date &gt; current()/price_date]/price_supplier_name = current()/price_supplier_name"/> 
          <xsl:otherwise> 
           <xsl:copy> 
            <xsl:apply-templates/> 
           </xsl:copy> 
          </xsl:otherwise> 
         </xsl:choose> 

        </xsl:otherwise> 
       </xsl:choose> 
      </xsl:for-each> 
     </xsl:copy> 
    </xsl:template> 

</xsl:stylesheet> 

輸出

<?xml version="1.0" encoding="utf-8"?> 
<root> 
    <price_record> 
     <price>382.5</price> 
     <price_date>20080725</price_date> 
     <price_supplier_name>ABC</price_supplier_name> 
     <seq_num>2</seq_num> 
    </price_record> 
    <price_record> 
     <price>78</price> 
     <price_date>20060928</price_date> 
     <!-- modified --> 
     <price_supplier_name>YZ</price_supplier_name> 
     <seq_num>3</seq_num> 
    </price_record> 
</root> 
+0

哇,快速編輯,我的答案是無用的。 –

+0

這個要求是隻給一個供應商最近的一個記錄 – user3309204

+0

@ Joel M. Lamsen,你的回答很有用,但有一點是我們只需要每個組的最新記錄 – user3309204

0

您可以使用此XSLT:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"> 

<xsl:output indent="yes"/> 


<xsl:template match ="price_records"> 
    <xsl:copy> 
     <xsl:for-each-group select="price_record" group-by="price_supplier_name"> 
      <xsl:for-each select="current-group()"> 
       <xsl:sort select="price_date" order="descending"/> 
       <xsl:if test="position() = 1"> 
        <xsl:copy-of select="."/> 
       </xsl:if> 
      </xsl:for-each> 
     </xsl:for-each-group> 
    </xsl:copy> 
</xsl:template> 

</xsl:stylesheet> 
+0

得到編譯錯誤說,元素「for-each-group」在xslt中無效。 – user3309204

+0

@ user3309204它在XSLT 1.0中無效。請將xslt-1.0標籤添加到您的問題中。 –

+0

你的樣式表說'version =「1.0」'但你使用2.0函數。你會想改變這一點,不要將不熟悉的人混淆。 –

0

我想我會繼續併發布答案。以下XSLT代碼在XSL 1.0中使用Muenchian分組得到a獨一無二的價格,這是每個供應商的最新價格。我幾次讀到你的問題,除非我錯過了某些東西,否則你只會詢問最近的價格,但沒有說明當同一天有兩種不同的價格出現在單一供應商時你想要什麼......情況就是如此爲「YZ」供應商。但是由於XML無論如何都不完整,爲了簡單起見,我認爲這是一個錯字。這裏你去:

<?xml version="1.0" encoding="UTF-8"?> 

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="xml" indent="yes"/> 

<xsl:key name="supplierToRecord" match="price_record" use="price_supplier_name"/> 
<xsl:template match="root"> 
    <root> 
    <xsl:for-each select="price_record[generate-id()=generate-id(key('supplierToRecord', price_supplier_name)[1])]"> 
     <xsl:for-each select="key('supplierToRecord', price_supplier_name)"> 
      <xsl:sort select="price_date" order="descending"/> 
      <xsl:if test="position() = 1"> 
       <xsl:copy-of select="."/> 
      </xsl:if> 
     </xsl:for-each> 
    </xsl:for-each> 
    </root> 
</xsl:template> 

</xsl:stylesheet> 
+0

感謝您的回覆。如您所說,這是我實際xslt的錯字。 – user3309204

+0

我的問題沒有完全解決,但它幫助我知道如何處理這種需求。 – user3309204