5

フィードからデータを取得するために XSLT を使用しています。現在、フィードから最初のアイテムを選択するだけのこのコード ブロックを使用しています。このサンプル XML に適用されるように少し変更しました。

<?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>
  <xsl:apply-templates/> 
  </body>
  </html>
</xsl:template>

<xsl:template match="/">
  <xsl:value-of select="catalog/book/author"/>
</xsl:template>

</xsl:stylesheet>

xml を価格で並べ替えて、最高価格の本に関連付けられている著者を選びたいと考えています。ありとあらゆることを試してみたのですが、どうしてもわかりません。

現在の出力は「ガンバルデラ、マシュー」ですが、「ガロス、マイク」にする必要があります。

4

3 に答える 3

3

xml を価格で並べ替えて、最高価格の本に関連付けられている著者を選びます。

FWIW、純粋なXPathでもそれを行うことができます。

/catalog/book[not(price < /catalog/book/price)]/author

(述語は次のように読みます:「どの本よりも低くないもの<book>を選択してください<price>。」)

<author>Galos, Mike</author>これにより、サンプル XMLで選択されます。

ノート

  • この式は、最高価格の本を選択するのではなくすべて最高価格の本を選択します (つまり、同じ価格の本が 2 冊ある場合、2 冊の本を選択します)。使用する

    /catalog/book[not(price < /catalog/book/price)][1]/author
    

    一致する本を 1 つだけ選択します (文書順で最初の本が選択されます)。

  • XPath は、 「より小さい/より大きい (または等しい)」タイプの数値との比較の両方のオペランドを自動的に強制します。<price>の値が数値に直接変換できる限り、上記の式は成功します。

  • これは逆論理 ( "not(lower than any)" ) でなければなりません。これは、逆 ( "greater than any" ) が真になることはあり得ないためです (一方、「greater than or equal to any」は常に true になります)。

  • nodeset1[expression < nodeset2]操作の時間計算量は
    O(count(nodeset1) × count(nodeset2))です。
    上記の場合nodeset1、 とnodeset2は同じなので、有効な時間計算量は
    O(n²)です。
    言い換えれば、これはこの問題を解決するための最も効率的な方法ではありません (私はそう言いたいと思い<xsl:apply-templates>ます<xsl:sort>) が、その一方で - それはあなたにとって十分に速いかもしれないワンライナーです。

于 2012-11-06T14:39:15.037 に答える
1

<xsl:sort>次のように、apply-templates 内で指定できます。

<xsl:template match="/">
    <html>
        <body>
            <xsl:apply-templates select="/catalog/book">
                <xsl:sort select="price" order="descending" data-type="number"/>
            </xsl:apply-templates>
        </body>
   </html>
</xsl:template>

次に、小さな「本」テンプレートで、を使用しposition()て最初の本ノードのみを除外します

<xsl:template match="book">
    <xsl:if test="position() = 1">
        <xsl:value-of select="author"/>
        <br/>
        <xsl:value-of select="price"/>
    </xsl:if>
</xsl:template>
于 2012-11-06T13:58:40.457 に答える
0

最初のものだけを返すには、位置関数を使用する必要があります。

<xsl:template match="/">
    <html>
        <body>
            <xsl:apply-templates select="/catalog/book">
                <xsl:sort select="price" order="descending" data-type="number"/>
            </xsl:apply-templates>
        </body>
   </html>
</xsl:template>

<xsl:template match="book">
   <xsl:if test="position()=first()">
       <xsl:value-of select="author"/>
   </xsl:if>
</xsl:template>
于 2012-11-06T14:08:03.367 に答える