0

映画とその俳優を保存する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」はプレーンテキストとして表示されます。

4

1 に答える 1

1

確かに、はるかに簡単なアプローチは、単純にテンプレートを要素に直接適用し、属性を持つものと別のテンプレートを使用しないものをname区別することです。link

<xsl:template match="movie">    
    <xsl:text>Actors: </xsl:text>
    <xsl:apply-templates select="actors/actor/name"/>
</xsl:template>

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

<xsl:template match="name">
  <xsl:value-of select="."/><br/>
</xsl:template>
于 2013-03-14T23:59:53.117 に答える