2012-02-20 29 views
0

下面是document_1.xml如何使用xslt從文檔中減少排序的價值?

<products> 
    <product> 
     <name>Pen</name> 
     <Quantity>10</Quantity> 
    </product> 
    <product> 
     <name>Pencil</name> 
     <Quantity>20</Quantity> 
    </product> 
    <product> 
     <name>Bag</name> 
     <Quantity>25</Quantity> 
    </product> 
</products> 

document_2.xml

<products> 
    <product> 
     <name>Pen</name> 
     <Quantity>30</Quantity> 
    </product> 

    <product> 
     <name>Pencil</name> 
     <Quantity>5</Quantity> 
    </product> 
    <product> 
     <name>Bag</name> 
     <Quantity>2</Quantity> 
    </product> 
</products> 

document.xml

<products> 
</products> 

下面是我的XSL,我曾經參加document_1.xmldocument_2.xmldocument.xml

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

<xsl:template match="/products"> 
<xsl:copy> 
<xsl:apply-templates select="document('document_1.xml')/*/product"/> 
<xsl:apply-templates select="document('document_2.xml')/*/product"/> 
</xsl:copy> 
</xsl:template> 

<xsl:template match="@* | node()"> 
<xsl:copy> 
<xsl:apply-templates select="@* | node()"> 
</xsl:apply-templates> 
</xsl:copy> 
</xsl:template> 

</xsl:stylesheet> 

我需要一個像下面

  1. 排序輸出由數量ASC
  2. 和獨特<name>以最小的控管數量

    <products> 
        <product> 
         <name>Bag</name> 
         <Quantity>2</Quantity> 
        </product> 
        <product> 
         <name>Pencil</name> 
         <Quantity>5</Quantity> 
        </product> 
        <product> 
         <name>Pen</name> 
         <Quantity>10</Quantity> 
        </product> 
    

+0

您發佈的輸出在我看來像document_2。XML只有這樣排序單個文件應該很容易。然而你的文字說你想加入兩份文件。確切地說,你想添加數量(例如,你可以得到'')? – 2012-02-20 12:08:41

+0

需要加入兩個文件,並採取最佳價值。因爲有些原因會導致價格較低,首先是文件 – user475464 2012-02-20 12:26:56

+0

請解釋什麼是「最佳」價值的標準。如果產品有兩種數量,您希望在結果文檔中使用哪一種數量? – 2012-02-20 12:30:17

回答

0

這個簡單的變換

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 
<xsl:strip-space elements="*"/> 

<xsl:key name="kProdByName" match="product" use="name"/> 

<xsl:variable name="vallProds" select= 
"document('file:///c:/temp/delete/document_1.xml')/*/* 
| 
    document('file:///c:/temp/delete/document_2.xml')/*/* 
"/> 

<xsl:template match="/*"> 
    <xsl:variable name="vrtfProds"> 
    <xsl:apply-templates select="$vallProds"> 
    <xsl:sort select="name"/> 
    <xsl:sort select="Quantity" data-type="number"/> 
    </xsl:apply-templates> 
    </xsl:variable> 

    <products> 
    <xsl:for-each select="msxsl:node-set($vrtfProds)"> 
    <xsl:copy-of select= 
    "*[generate-id() = generate-id(key('kProdByName', name)[1])]"/> 
    </xsl:for-each> 
    </products> 
</xsl:template> 

<xsl:template match="product"> 
    <xsl:copy-of select="."/> 
</xsl:template> 
</xsl:stylesheet> 

適用於任何XML文檔(可能是document.xml中,但這不使用),並具有兩個提供的文件駐留在:c:\temp\delete\document_1.xmlc:\temp\delete\document_1.xml

產生想要的,正確的結果

<products> 
    <product> 
     <name>Bag</name> 
     <Quantity>2</Quantity> 
    </product> 
    <product> 
     <name>Pen</name> 
     <Quantity>10</Quantity> 
    </product> 
    <product> 
     <name>Pencil</name> 
     <Quantity>5</Quantity> 
    </product> 
</products> 

說明

  1. 排序兩個文件聯盟的product元素由兩個鍵nameQuantity

  2. 提取從上述步驟1製備的RTF(Result Tree Fragment)的正則樹和由name執行productMuenchian grouping

0

用戶此代碼爲排序

<xsl:for-each select="products/product"> 
     <xsl:sort select="Quantity"/> 
     <tr> 
     <td><xsl:value-of select="name"/></td> 
     <td><xsl:value-of select="Quantity"/></td> 
     </tr> 
    </xsl:for-each> 
+0

如何採取不同的? – user475464 2012-02-20 12:01:45

+0

正在爲你排序嗎? – 2012-02-20 12:21:03

+0

像下面它的工作 user475464 2012-02-20 12:25:10

0

下面是一個示例XSLT 1.0利用所述exsl:node-set擴展函數大多數處理器支持的:

<xsl:stylesheet 
    version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:exsl="http://exslt.org/common" 
    exclude-result-prefixes="exsl"> 

    <xsl:param name="doc1-url" select="'document1.xml'"/> 
    <xsl:param name="doc2-url" select="'document2.xml'"/> 

    <xsl:variable name="doc1" select="document($doc1-url)"/> 
    <xsl:variable name="doc2" select="document($doc2-url)"/> 

    <xsl:output indent="yes"/> 

    <xsl:key name="k1" match="product" use="name"/> 

    <xsl:template match="@* | node()"> 
    <xsl:copy> 
     <xsl:apply-templates select="@* | node()"/> 
    </xsl:copy> 
    </xsl:template> 

    <xsl:template match="products"> 
    <xsl:copy> 
     <xsl:variable name="joined-products"> 
     <xsl:copy-of select="$doc1//product | $doc2//product"/> 
     </xsl:variable> 
     <xsl:variable name="grouped-products"> 
     <xsl:apply-templates select="exsl:node-set($joined-products)/product[generate-id() = generate-id(key('k1', name)[1])]" mode="group"/> 
     </xsl:variable> 
     <xsl:apply-templates select="exsl:node-set($grouped-products)/product"> 
     <xsl:sort select="Quantity" data-type="number"/> 
     </xsl:apply-templates> 
    </xsl:copy> 
    </xsl:template> 

    <xsl:template match="product" mode="group"> 
    <xsl:copy> 
     <xsl:copy-of select="name"/> 
     <Quantity> 
     <xsl:for-each select="key('k1', name)"> 
      <xsl:sort select="Quantity" data-type="number"/> 
      <xsl:if test="position() = 1"> 
      <xsl:value-of select="Quantity"/> 
      </xsl:if> 
     </xsl:for-each> 
     </Quantity> 
    </xsl:copy> 
    </xsl:template> 

</xsl:stylesheet> 
+0

我收到錯誤消息:Namespace'http://exslt.org/common'不包含任何函數。 – user475464 2012-02-20 15:30:14

+0

您使用哪種XSLT處理器?如果是MSXML,則將'xmlns:exsl =「http://exslt.org/common」'更改爲'xmlns:ms =「urn:schemas-microsoft-com:xslt」',然後當然在我使用' exsl:node-set'你需要使用'ms:node-set'。最後使用'exclude-result-prefixes =「ms」'。 – 2012-02-20 16:02:20