5

私は次のようなxmlを持っています:

<bookstores>
    <bookstore>
        <book id="1">
            <author>ABC</author> 
        </book>
        <book id="2">
            <title>YYY</title> 
        </book>
    </bookstore>
    <bookstore>
        <book id="3">
            <author>ABC</author> 
        </book>
        <book id="4">
            <author>DEF</author> 
        </book>
    </bookstore>
    <bookstore>
        <book id="5">
            <price>50</price>
        </book>
        <book id="6">
            <title>ZZZ</title> 
        </book>
    </bookstore>
</bookstores>

「本」ノードの子の最初のオカレンス、つまり「本」ノードのすべての一意の子ノードを選択したいと思います。

したがって、出力は次のようになります。

author
title
price

xslt を次のように記述しました。

<xsl:for-each select="bookstores/bookstore/book"> 
    <xsl:if test="count(preceding-sibling::*[1]) = 0">
        <xsl:value-of select="local-name(*[1])"/>
    </xsl:if>
</xsl:for-each>

それは私に何も返さなかった...誰か私にこれについて助けてもらえますか?ありがとう!!

アップデート:

xml に複数の「本屋」要素があり、各「本屋」のコンテキスト内での一意性を制限して、「著者」が 1 つの「本屋」に表示されるようにしたい場合はどうすればよいでしょうか。別の「書店」に登場?

4

3 に答える 3

3

XSLT1.0 を使用している場合、別個の要素を取得する方法は Muenchian Grouping と呼ばれる手法です。あなたの場合、ブックの子要素で「グループ化」したいので、まず要素名でブックの子要素を検索するキーを定義します

 <xsl:key name="child" match="book/*" use="local-name()" />

個別の名前を取得するには、すべての book 子要素を調べますが、指定された名前のグループで最初に出現する要素のみを出力します。これを行うには、次の恐ろしいステートメントを使用します。

<xsl:apply-templates 
   select="//book/*[generate-id() = generate-id(key('child', local-name())[1])]" />

ここに完全な XSLT があります

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
   <xsl:output method="text"/>
   <xsl:key name="child" match="book/*" use="local-name()" />

   <xsl:template match="/">
      <xsl:apply-templates select="//book/*[generate-id() = generate-id(key('child', local-name())[1])]" />
   </xsl:template>

   <xsl:template match="//book/*">
      <xsl:value-of select="concat(local-name(), '&#10;')" />
   </xsl:template>
</xsl:stylesheet>

XML に適用すると、以下が出力されます。

author
title
price
于 2013-03-28T23:17:18.973 に答える
3

やや短くシンプル - 完全に「プッシュスタイル」:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output method="text"/>
 <xsl:key name="kBChildrenByName" match="book/*" use="name()"/>

 <xsl:template match=
  "book/*[generate-id()=generate-id(key('kBChildrenByName', name())[1])]">
     <xsl:value-of select="concat(name(), '&#xA;')"/>
 </xsl:template>
 <xsl:template match="text()"/>
</xsl:stylesheet>

この変換が提供された XML ドキュメントに適用されると、次のようになります。

<bookstores>
    <bookstore>
        <book id="1">
            <author>ABC</author>
        </book>
        <book id="2">
            <title>YYY</title>
        </book>
    </bookstore>
    <bookstore>
        <book id="3">
            <author>ABC</author>
        </book>
        <book id="4">
            <author>DEF</author>
        </book>
    </bookstore>
    <bookstore>
        <book id="5">
            <price>50</price>
        </book>
        <book id="6">
            <title>ZZZ</title>
        </book>
    </bookstore>
</bookstores>

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

author
title
price

説明:

Muenchian グループ化方法の適切な使用。

于 2013-03-29T02:08:54.867 に答える
-1

<xsl:for-each select="//book">オカレンスの選択に使用でき ます

于 2013-03-28T23:01:40.130 に答える