映画とその俳優を保存する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="bob.website.com">Bob</name>
<age>29</age>
<height>1.75 m</height>
<from>USA</from>
</actor>
<actor actorID="2">
<name link="jack.website.com">Jack</name>
<age>24</age>
<height>1.83 m</height>
<from>UK</from>
</actor>
<actor actorID="3">
<name>James</name>
</actor>
<actor actorID="4">
<name>Tom</name>
</actor>
<actor actorID="5">
<name>Mark</name>
</actor>
</actors>
</movie>
</movies>
上記のコードからわかるように、「movie」要素内に5人の俳優がいます。最初の2つのアクターには、4つの子要素(name、age、height、from)と、特定のアクターのページへのハイパーリンクを提供する「name」要素内の属性「link」が含まれています。他の3つのアクターには、要素「name」のみが含まれています。
私のページでは、リストに5人の俳優の名前を表示し、最初の2人の名前をハイパーリンク(特定の俳優のページへのリンク)として表示し、他の3人を通常のテキストとして表示したいと思います。
ハイパーリンクされた名前と通常の名前を区別したいのは、XPathを使用する方法です。複数の子要素(この場合はname、age、height、from)を含むすべての「actor」要素をハイパーリンクとして表示したいと思います。通常のテキストとして表示される子要素を1つだけ含む他のすべての「アクター」要素
これは、私が作成したXpathクエリを含むXSLTファイルです。
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" omit-xml-declaration="yes" indent="yes" media-type="text/html"/>
<xsl:template match="movie">
<xsl:text>Actors: </xsl:text>
<xsl:apply-templates select="actors/actor"/>
</xsl:template>
<xsl:template match="actor">
<xsl:if test="//actor/*[position()>1]/../name">
<a href="{@link}">
<xsl:value-of select="name"/>
</a>
</xsl:if>
<xsl:element name="br"/>
</xsl:template>
</xsl:stylesheet>
クエリを作成できましたが//actor/*[position()>1]/../name
、最初の2人のアクターの名前のみが表示されます(Xpath notepad ++プラグインでテスト済み)。「link」属性で正しく接続してページに表示する方法がわかりません。
これが私が達成したい最終結果です。
「actor」要素には複数の子要素が含まれているため、最初の2つのアクターの名前はハイパーリンクされています。他の3つの「actor」要素には1つの子要素しか含まれていないため、対応する「names」はプレーンテキストとして表示されます。