0

この質問は、クエリXSLTに続きます。他のノードからの値の合計に基づく並べ替え

私はこのxslt(Demitreのおかげで)を持っています。これは、値「P」(ペース)、「T」(トロット)、または「A」(すべて)を持つことができるパラメーター「Gait」を受け取るように変更しました。

<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:param name="Gait"/>

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

上記のコードにはこの部分があります

sum(key('kOffspring', ID)/*/Stakes

歩行に渡された値に応じて、アスタリスク部分をxmlツリーのノードの名前に置き換える方法はありますか?

超簡略化されたxmlは次のとおりです。

<t>
    <Horses>
        <Horse>
            <ID>5</ID>
            <Name>hrsE</Name>
            <SireID>101</SireID>
            <Pace>
                <Stakes>100</Stakes>
            </Pace>
            <Trot>
                <Stakes>300</Stakes>
            </Trot>
        </Horse>
    </Horses>
    <Sires>
        <Sire>
            <ID>101</ID>
            <Name>srA</Name>
            <LiveFoalsALL>117</LiveFoalsALL>
        </Sire>
    </Sires>
</t>

$Gaitが'A'の場合 、sum(key('kOffspring'、ID)/ * / Stakes (Horseのすべてのサブノードを調べます)が必要です

$Gaitが'P'の場合 、sum(key('kOffspring'、ID)/ Pace / Stakes(Stakesを見つけるにはPaceノードのみを調べてください)が必要です

$Gaitが'T'の場合 、sum(key('kOffspring'、ID)/ Trot / Stakes(TrotノードでStakesを見つけるだけです)が必要です

したがって、これは非常に単純化された例です。$ Gaitのさまざまな値に対応するために、100行のコードを複製する必要をなくそうとしています。変数を使用してみましたが、パスでキーを使用しているときにノードパスの値を変更する方法がわかりませんでした。'match = "/ *"'テンプレートでchooseステートメントを使用できる可能性があることを確認しましたが、これは並べ替え専用であり、'Sire'テンプレートに到達したときにスタックしていました。私が持っている多数の「value-ofselect」ステートメントの周りで「select」を選択します。

提案をありがとう。よろしく、ブライスステンバーグ。

4

2 に答える 2

2

使うだけ

sum(key('kOffspring', ID)/*[name()=$Gait]/Stakes
于 2012-11-26T07:33:46.550 に答える
1
<xsl:value-of select="sum(key('kOffspring', ID)/*/Stakes)" />

gait に渡された値に応じて、アスタリスク部分を xml ツリーのノードの名前に置き換える方法はありますか?

はい... 1 つの方法は、XPath 式内に「switch ステートメント」を含めることです。

sum(key('kOffspring', ID)/*[
    $Gait = 'A' or
    (local-name() = (if ($Gait = 'P') then 'Pace' else
                        if ($Gait = 'T') then 'Trot'))
  ]/Stakes)

<xsl:value-of>または、 $Gait の可能な値ごとに 1 つずつ、3 つの異なるバージョンの を記述し、 を使用して使用するバージョン<xsl:choose>を選択することもできます。

<xsl:choose>
   <xsl:when test="$Gait = 'A'">
      <xsl:value-of select="sum(key('kOffspring', ID)/*/Stakes)" />
   </xsl:when>
   <xsl:when test="$Gait = 'P'">
      <xsl:value-of select="sum(key('kOffspring', ID)/Pace/Stakes)" />
   </xsl:when>
   etc.

プロセッサによっては、より読みやすく、<xsl:choose>より効率的かもしれません。しかし、それは主に好みの問題です。

于 2012-11-26T03:00:22.760 に答える