映画とその俳優を格納する 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)">
それらのすべてがページにエラーを表示させました。