3

同じ親要素で複数回使用されている要素の値を取得する場合、最初の要素だけでなく、同じ名前の各要素を取得したいと考えています。

例 -

<catalog>
<cd>
    <title>Empire Burlesque</title>
    <artist>Bob Dylan</artist>
            <artist>Bob Dylan2</artist>
            <artist>Bob Dylan3</artist>
    <country>USA</country>
    <company>Columbia</company>
    <price>10.90</price>
    <year>1985</year>
</cd>
</catalog>

ここで、各 CD を for-each し、value-of を使用してアーティスト名を出力すると、最初の要素しか取得できません (ある程度理解できます)。しかし、for-each ループ内で同じ名前のすべての要素を取得するにはどうすればよいでしょうか? 内部の for-each ループを実行しようとしましたが、うまくいきませんでした。

私はXMLとその仕組みに非常に慣れていないので、簡単に教えてください...:-(

4

6 に答える 6

9
<xsl:template match="/">
    <xsl:for-each select="catalog">
        <!-- Print Other Stuff, if required -->
        <xsl:for-each select="cd/artist">
            <xsl:value-of select="text()"/><br/>
        </xsl:for-each>
    </xsl:for-each>
</xsl:template>

出力:

ボブ・ディラン
ボブ・ディラン2 ボブ・ディラン
3

于 2011-12-04T16:26:26.600 に答える
4

これで、for-each各CDをvalue-of調べて、アーティスト名を出力するために使用すると、最初の要素のみが取得されます(ある程度理解できます)。for-each しかし、ループ内で同じ名前のすべての要素を取得するにはどうすればよいですか?for-each内側のループを試しましたが、うまくいきませんでした。

XSLT初心者への私のアドバイスは、 使用しないことです-可能な限り。必要なユースケースは1つだけですが、これはめったに発生しません(関数がこの特定のドキュメント用に作成されたインデックスを使用するように、現在のドキュメントを明示的に変更する必要がある場合)。<xsl:for-each><xsl:for-each>key()

これはおそらく最も単純な解決策の1つです(ネストなし<xsl:for-each>およびネストなし):

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output method="text"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match="artist">
  <xsl:value-of select="concat(., '&#xA;')"/>
 </xsl:template>

 <xsl:template match="text()"/>
</xsl:stylesheet>

この変換が提供されたXMLドキュメントに適用される場合

<catalog>
    <cd>
        <title>Empire Burlesque</title>
        <artist>Bob Dylan</artist>
        <artist>Bob Dylan2</artist>
        <artist>Bob Dylan3</artist>
        <country>USA</country>
        <company>Columbia</company>
        <price>10.90</price>
        <year>1985</year>
    </cd>
</catalog>

必要な正しい結果が生成されます:

Bob Dylan
Bob Dylan2
Bob Dylan3
于 2011-12-05T00:59:28.183 に答える
3
<xsl:template match="catalog/cd/artist">
    <xsl:value-of select="." />
</xsl:template>
于 2011-12-04T16:38:54.517 に答える
1

内部ループが機能しない理由はありません。これを行うためにどの XSLT 構文を使用しましたか? あなたが説明したことはうまくいくはずなので、xpathsなどにエラーがあるようです。

于 2011-12-04T16:24:42.147 に答える
0

XPATHが間違っている可能性があります。

foreachを使用してCD要素にいる間:

  <xsl:template match="/">
    <xsl:for-each select="//cd">
      <xsl:for-each select="artist">
        <xsl:message terminate="no">
          <xsl:value-of select="."/>
        </xsl:message>
      </xsl:for-each>
    </xsl:for-each>
  </xsl:template>

それはすべてのアーティストを印刷します。

于 2011-12-04T16:27:54.240 に答える
0

text()xpath 構文は、現在指定されているノードの任意のテキスト子ノードを選択します。

このウェブサイトを特に気に入らない人もいますが、最初は正しい方向に向けることは悪くありません -ここをクリック

于 2011-12-04T21:21:00.770 に答える