2

我有以下 XML:

<?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"/>

...

4

2 回答 2

2

我不确定这是否是一种特别优雅的方式,但您可以迭代价格元素而不是入口元素

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

然后,您需要一个xsl:if条件来检查每个价格元素是否没有更高的价格元素

<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>
于 2012-09-14T11:44:47.307 回答
0

See my answer to this question.

"Minimum" is used there, but otherwise the solution is essentially what is needed.

于 2012-09-14T12:29:38.197 回答