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>

各要素には複数の値札があります。要素ごとに最大価格を選択し、それを残りの要素との比較に使用したいと思います。

私の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

この質問に対する私の回答を参照してください。

そこでは「最小」が使用されますが、それ以外の場合は、ソリューションは本質的に必要なものです。

于 2012-09-14T12:29:38.197 に答える