2012-09-14 67 views
2

我有以下XML:XSLT排序多個子節點上,每個家長

<?xml version="1.0" encoding="ISO-8859-1"?> 
<entries> 
    <entry> 
     <title>Entry 1</title> 
       <prices> 
       <price>10</price> 
       <price>50</price> 
       </prices> 
    </entry> 
    <entry> 
     <title>Entry 2</title> 
       <prices> 
       <price>200</price> 
       <price>300</price> 
       </prices> 
    </entry> 
    <entry> 
     <title>Entry 3</title> 
       <prices> 
       <price>70</price> 
       <price>500</price> 
       </prices> 
    </entry> 
</entries> 

每一個元素都有一個以上的價碼,我要選擇MAX的價格,每個元素,並使用它與其他元素進行比較。

我的XSLT是:

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

<xsl:template match="/"> 
    <html> 
    <body> 
    <table border="1"> 
     <tr> 
     <th>Title</th> 
     <th>Highest Price</th> 
     </tr> 
     <xsl:for-each select="entries/entry"> 
     <xsl:sort select="prices/price" order="descending" data-type="number"/> 
     <tr> 
     <td><xsl:value-of select="title"/></td> 
     <td><xsl:value-of select="prices/price"/></td> 
     </tr> 
     </xsl:for-each> 
    </table> 
    </body> 
    </html> 
</xsl:template> 

</xsl:stylesheet> 

它不工作。它產生:

Title Highest Price 
Entry 2 200 
Entry 3 70 
Entry 1 10 

雖然它應該產生:

Title Highest Price 
Entry 3 500 
Entry 2 300 
Entry 1 50 

請告訴我。我不得不使用XSLT1,所以我真的不能做:

<xsl:sort select="max(prices/price)" order="descending" data-type="number"/> 

...

+1

如何在輸出中使用「30」,但它甚至不在源XML中。請編輯您的源XML,以便它符合您的預期輸出。最好的問候,彼得 – Peter

+0

@彼得,對不起,你是對的,我編輯它。謝謝。 –

回答

2

我不知道這是否是做的一個特別優雅的方式,但你可以遍歷價格元素,而不是進入元素

<xsl:for-each select="entries/entry/prices/price"> 
    <xsl:sort select="." order="descending" data-type="number"/> 

然後,你需要一個XSL:如果條件檢查每個價格元素沒有一個較高的該元素

<xsl:if test="not(../price > current())"> 

以下是完整的XSLT

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:template match="/"> 
     <html> 
     <body> 
      <table border="1"> 
       <tr> 
        <th>Title</th> 
        <th>Highest Price</th> 
       </tr> 
       <xsl:for-each select="entries/entry/prices/price"> 
        <xsl:sort select="." order="descending" data-type="number"/> 
        <xsl:if test="not(../price > current())"> 
        <tr> 
         <td> 
          <xsl:value-of select="../../title"/> 
         </td> 
         <td> 
          <xsl:value-of select="."/> 
         </td> 
        </tr> 
        </xsl:if> 
       </xsl:for-each> 
      </table> 
     </body> 
     </html> 
    </xsl:template> 
</xsl:stylesheet> 

當適用於您的XML,下面是輸出

<html> 
<body> 
<table border="1"> 
<tr> 
<th>Title</th> 
<th>Highest Price</th> 
</tr> 
<tr> 
<td>Entry 3</td> 
<td>500</td> 
</tr> 
<tr> 
<td>Entry 2</td> 
<td>300</td> 
</tr> 
<tr> 
<td>Entry 1</td> 
<td>50</td> 
</tr> 
</table> 
</body> 
</html> 
0

看到我的回答this question

那裏使用「Minimum」,但否則解決方案基本上是需要的。