3

私はxsltのコーディングにかなり慣れておらず、次のことをしようとしてかなり行き詰まっています。

馬の繁殖情報を2つの主要なセクションに分けたxmlファイルがあります。1. Horsesノードには、個々の馬のパフォーマンスの詳細と、その種馬が誰であるかを示すIDがあります。2. Siresノードは、繁殖固有の統計も保持しているSiresのリストです。

子馬が獲得した「賭け金」の合計に基づいて、種雄牛のリストを並べ替える必要があります(つまり、馬のノードで)。

したがって、切り詰められたxmlファイルは次のようになります。

<Horses>
    <Horse>
        <ID>1</ID>
        <Name>hrsA</Name>
        <SireID>101</SireID>
        <Pace>
            <Stakes>4800</Stakes>
        </Pace>
    </Horse>
    <Horse>
        <ID>2</ID>
        <Name>hrsB</Name>
        <SireID>102</SireID>
        <Pace>
            <Stakes>3600</Stakes>
        </Pace>
    </Horse>
    <Horse>
        <ID>3</ID>
        <Name>hrsC</Name>
        <SireID>102</SireID>
        <Pace>
            <Stakes>2800</Stakes>
        </Pace>
    </Horse>
    <Horse>
        <ID>4</ID>
        <Name>hrsD</Name>
        <SireID>101</SireID>
        <Pace>
            <Stakes>56</Stakes>
        </Pace>
    </Horse>
    <Horse>
        <ID>5</ID>
        <Name>hrsE</Name>
        <SireID>100</SireID>
        <Pace>
            <Stakes>20000</Stakes>
        </Pace>
    </Horse>
    <Horse>
        <ID>6</ID>
        <Name>hrsF</Name>
        <SireID>101</SireID>
        <Trot>
            <Stakes>20000</Stakes>
        </Trot>
    </Horse>
    <Horse>
        <ID>7</ID>
        <Name>hrsG</Name>
        <SireID>101</SireID>
        <Trot>
            <Stakes>559</Stakes>
        </Trot>
    </Horse>
    <Horse>
        <ID>8</ID>
        <Name>hrsH</Name>
        <SireID>102</SireID>
        <Pace>
            <Stakes>386</Stakes>
        </Pace>
        <Trot>
            <Stakes>10000</Stakes>
        </Trot>
    </Horse>
</Horses>
<Sires>
    <Sire>
        <ID>100</ID>
        <Name>srA</Name>
        <LiveFoalsALL>117</LiveFoalsALL>
    </Sire>
    <Sire>
        <ID>101</ID>
        <Name>srB</Name>
        <LiveFoalsALL>774</LiveFoalsALL>
    </Sire>
    <Sire>
        <ID>102</ID>
        <Name>srC</Name>
        <LiveFoalsALL>43</LiveFoalsALL>
    </Sire>
</Sires>

したがって、さまざまな賭け金を合計すると、出力の順序は次のようになります。

Sire 101 (srB) Stakes: $25415
Sire 100 (srA) Stakes: $20000
Sire 103 (srC) Stakes: $16768.

私が他のウェブページのために個々の馬の賭け金を合計して注文したとき、私は使用することができました:

<xsl:apply-templates select="Horse">
    <xsl:sort select="sum(descendant::Stakes)" data-type="number"
        order="descending"/>
</xsl:apply-templates>

正しい順序を取得するために合計するために馬のノードを参照している種雄牛に対して同じことを行う方法がわかりません...おそらく、Sire/IDがHorse/SireIDと等しいと言っているようなものです:

<xsl:apply-templates select="Sire">
    <xsl:sort select="sum(//Horses/Horse[@SireID=ID]/descendant::Stakes)" 
        data-type="number" order="descending"/>
</xsl:apply-templates>

しかし、それは機能しません。デバッガーは、ソート行に到達すると現在のテンプレートから直接ジャンプするため、構文が無効である必要があります。私はこのテーマのバリエーションを試しましたが、成功しませんでした。

誰かが私のSireテンプレートを呼び出して正しい順序を取得する方法のポインタを教えてもらえますか?

ありがとう、

ブライス・ステンバーグ

4

2 に答える 2

2

この変換

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:key name="kOffspring" match="Horse" use="SireID"/>

 <xsl:template match="/*">
  <xsl:apply-templates select="Sires/Sire">
   <xsl:sort select="sum(key('kOffspring', ID)/*/Stakes)"
             data-type="number" order="descending"/>
  </xsl:apply-templates>
 </xsl:template>

 <xsl:template match="Sire">
     Sire <xsl:value-of select="concat(ID,' (', Name, ') Stakes: ')"/>
   <xsl:value-of select="sum(key('kOffspring', ID)/*/Stakes)"/>
 </xsl:template>
 <xsl:template match="text()"/>
</xsl:stylesheet>

提供されたXMLドキュメントに適用した場合:

<t>
    <Horses>
        <Horse>
            <ID>1</ID>
            <Name>hrsA</Name>
            <SireID>101</SireID>
            <Pace>
                <Stakes>4800</Stakes>
            </Pace>
        </Horse>
        <Horse>
            <ID>2</ID>
            <Name>hrsB</Name>
            <SireID>102</SireID>
            <Pace>
                <Stakes>3600</Stakes>
            </Pace>
        </Horse>
        <Horse>
            <ID>3</ID>
            <Name>hrsC</Name>
            <SireID>102</SireID>
            <Pace>
                <Stakes>2800</Stakes>
            </Pace>
        </Horse>
        <Horse>
            <ID>4</ID>
            <Name>hrsD</Name>
            <SireID>101</SireID>
            <Pace>
                <Stakes>56</Stakes>
            </Pace>
        </Horse>
        <Horse>
            <ID>5</ID>
            <Name>hrsE</Name>
            <SireID>100</SireID>
            <Pace>
                <Stakes>20000</Stakes>
            </Pace>
        </Horse>
        <Horse>
            <ID>6</ID>
            <Name>hrsF</Name>
            <SireID>101</SireID>
            <Trot>
                <Stakes>20000</Stakes>
            </Trot>
        </Horse>
        <Horse>
            <ID>7</ID>
            <Name>hrsG</Name>
            <SireID>101</SireID>
            <Trot>
                <Stakes>559</Stakes>
            </Trot>
        </Horse>
        <Horse>
            <ID>8</ID>
            <Name>hrsH</Name>
            <SireID>102</SireID>
            <Pace>
                <Stakes>386</Stakes>
            </Pace>
            <Trot>
                <Stakes>10000</Stakes>
            </Trot>
        </Horse>
    </Horses>
    <Sires>
        <Sire>
            <ID>100</ID>
            <Name>srA</Name>
            <LiveFoalsALL>117</LiveFoalsALL>
        </Sire>
        <Sire>
            <ID>101</ID>
            <Name>srB</Name>
            <LiveFoalsALL>774</LiveFoalsALL>
        </Sire>
        <Sire>
            <ID>102</ID>
            <Name>srC</Name>
            <LiveFoalsALL>43</LiveFoalsALL>
        </Sire>
    </Sires>
</t>

必要な正しい結果を生成します

 Sire 101 (srB) Stakes: 25415
 Sire 100 (srA) Stakes: 20000
 Sire 102 (srC) Stakes: 16786

説明

  1. Horseを関数として指定するキーを定義しますSireID。これは、次のように、標準のXSLT関数の呼び出しでSireその子孫を提供するだけで、特定の子孫をすべて選択するのに役立ちます。IDkey()key('kOffspring', ID)

  2. Stakes同様に、与えられたすべての子孫の合計Sireは次のとおりsum(key('kOffspring', ID)/*/Stakes)です。

  3. XMLドキュメント内のすべての要素にテンプレートを適用し、それらの子孫Sireの合計の減少する値でこれらを並べ替えます。Stakes

  4. それぞれについて、その、およびその子孫の合計Sireを出力します。IDNameStakes

于 2012-11-21T22:06:28.290 に答える
1

あなたは使用する必要がありますcurrent()

<xsl:apply-templates select="Sire">
    <xsl:sort select="sum(//Horses/Horse[SireID = current()/ID]//Stakes)" 
        data-type="number" order="descending"/>

current()現在のXPath式のにあるコンテキストノードを提供します。この場合、 。<Sire>によって選択された現在の要素xsl:apply-templates。述語内では、コンテキストノードは<Horse>述語式に対してテストされている要素です。

ノート:

  • あなたは@そこにあなたが望まないものを持っていました。@IDID属性を参照します。
  • に置き換えdescendant::/ました//
  • @Dimitreが指摘したように、。の代わりにキーを使用すると、スタイルシートは大きな入力に合わせてスケーリングしやすくなります//foo[barID = current()/ID]
于 2012-11-21T22:04:39.347 に答える