1

映画とその俳優を格納する XML ファイルがあります。

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="index.xsl"?>
<movies
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="movies.xsd">

<movie movieID="1">
    <actors>
        <actor actorID="1"> 
            <name link="hello">Bob</name>
        </actor>

        <actor actorID="2"> 
            <name link="hello">Mike</name> 
        </actor>
    </actors>   
</movie>

<movie movieID="2">
    <actors>
        <actor actorID="1"> 
            <name link="hello">Bob</name>
        </actor>

        <actor actorID="2"> 
            <name>Daniel</name>
        </actor>
    </actors>   
</movie>

</movies>

上記のコードからわかるように、それぞれ 2 つの "actor" 子要素を含む 2 つの "movie" 要素があります。4 つの "name" 子要素のうち 3 つに "link" 属性が含まれています: Bob、Mike、Bob

次の XSLT コードを使用して、属性「リンク」を含むアクターの名前のみを表示しています。

<xsl:template match="/">
    <xsl:text>Actors: </xsl:text>
    <xsl:apply-templates select="/movies/movie/actors/actor/name[@link]"/>
</xsl:template>

<xsl:template match="name[@link]">
    <xsl:value-of select="." />
    <xsl:element name="br" />
</xsl:template>

私が得る出力:

Bob
Mike
Bob

ご覧のとおり、「Bob」という名前が 2 回繰り返されます。「リンク」属性を持つユニークな俳優名だけを表示したい

次の XPath 1.0 クエリを試しました。

<xsl:template match="[not(@name[@link] = preceding::@name)]">

<xsl:template match="not(@name[@link] = preceding::@name)">

<xsl:template match="not(@name[@link] = preceding-sibling::@name)">

それらのすべてがページにエラーを表示させました。

4

2 に答える 2

2

XSLT 1.0 でこのようなグループ化を行う効率的な方法は、Muenchian グループ化を使用することです (わかりやすくするために adivと aを追加しましたbr。削除してもかまいません)。

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/>
  <xsl:key name="kName" match="actor/name[@link]" use="." />

  <xsl:template match="/">
    <div>
      <xsl:text>Actors: </xsl:text>
      <br />
      <xsl:variable name="actorNames" 
                    select="/movies/movie/actors/actor/name[@link]"/>
      <xsl:apply-templates 
                    select="$actorNames[generate-id() = 
                                        generate-id(key('kName', .)[1])]" />
    </div>
  </xsl:template>

  <xsl:template match="name">
    <xsl:value-of select="." />
    <br />
  </xsl:template>
</xsl:stylesheet>

サンプル入力で実行すると、次が生成されます。

<div>
  Actors: <br />Bob<br />Mike<br />
</div>
于 2013-03-16T23:05:57.970 に答える