0

次のxmlドキュメントが与えられた場合...

   <ws>
       <series year="2005" mvp="Jermaine Dye">
          <team name="Chicago White Sox" wins="4" />
          <team name="Houston Astros" wins="0" />
       </series>
       <series year="2004" mvp="Manny Ramirez">
          <team name="Boston Red Sox" wins="4" />
          <team name="St. Louis Cardinals" wins="0" />
       </series>
    </ws>

各シリーズの最初のチームの名前属性を取得するためのキーを作成しました。次のように、各シリーズの各名前をループして一覧表示しようとしています。現在、結果が返されていません。参照値の何が問題なのかわかりません...

<xsl:key name="winners" match="team[1]" use="@name" />

    <xsl:template match="/">
        <xsl:for-each select="ws/series">
             <xsl:value-of select="key('winners', @name)" />
        </xsl:for-each>
    </xsl:template>

期待される出力は...

Chicago White Sox (the first team from series 1)
Boston Red Sox (the first team from series 2)

私が提供した xml データには、実際には数百あるのに 2 つの系列要素しか含まれていません。キーは、変換プロセスを高速化するために使用され、他のキーと連携して結果ドキュメントを生成します。

4

2 に答える 2

1

各シリーズの最初のチームの名前をリストしようとしています

キーを使用することは、このような単純なタスクにとって不必要な複雑さです。簡単に試してください:

<xsl:template match="/">
    <xsl:for-each select="ws/series">
        <xsl:value-of select="team[1]/@name" />
    </xsl:for-each>
</xsl:template>

もちろん、これにある種のラッパーまたはセパレーターを追加する必要があります。そうしないと、すべての名前がごちゃまぜになってしまいます-たとえば(出力メソッドがテキストであると仮定して):

<xsl:template match="/">
    <xsl:for-each select="ws/series">
        <xsl:value-of select="team[1]/@name" />
        <xsl:if test="position()!=last()">
            <xsl:text>&#10;</xsl:text>
        </xsl:if>
    </xsl:for-each>
</xsl:template>

編集:

キーを使用してこれを (人為的に) 行うには、チームをそのシリーズに接続しているもの (その子であること以外) を自問する必要があります。ここでの答えは「何もない」です。ただし、チームはその親シリーズ データにアクセスできます。したがって、年や MVP など、親シリーズの属性によってチームを識別することができます。MVP はシリーズに固有のものではない可能性があるため、キーを作成しましょう。

<xsl:key name="team-by-year" match="team" use="parent::series/@year" />

これは、「年を教えてくれたら、その年のシリーズでプレーしたチームを教えてあげる」という意味です。ここからは、現在のシリーズの年でキーを呼び出すだけです。

<xsl:template match="/">
    <xsl:for-each select="ws/series">
        <xsl:value-of select="key('team-by-year', @year)[1]/@name" />
        <xsl:if test="position()!=last()">
            <xsl:text>&#10;</xsl:text>
        </xsl:if>
    </xsl:for-each>
</xsl:template>
于 2014-02-20T02:40:11.633 に答える
0

これを使えば

<xsl:stylesheet version='1.0' xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output indent="yes"/>

    <xsl:key name="winners" match="team[1]" use="@name" />

    <xsl:template match="/">
        <xsl:for-each select="ws/series/*">
            <xsl:value-of select="key('winners', @name)/@name" />
        </xsl:for-each>
    </xsl:template>

</xsl:stylesheet>
于 2014-02-20T03:24:26.637 に答える