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>Bob</name>
            <age>23</age>
        </actor>

        <actor actorID="2"> 
            <name>Jack</name> 
            <age>25</age>
        </actor>

        <actor actorID="3"> 
            <name>James</name>
            <age>38</age>
        </actor>
    </actors>   
</movie>

<movie movieID="2">
    <actors>
        <actor actorID="1"> 
            <name>Mike</name>
            <age>19</age>
        </actor>

        <actor actorID="2"> 
            <name>Daniel</name>
            <age>29</age>
        </actor>

        <actor actorID="3"> 
            <name>Phil</name> 
            <age>41</age>
        </actor>
    </actors>   
</movie>

</movies>

上記のコードからわかるように、3つの「actor」子要素を含む2つの「movie」要素があります。各「movieID」は一意であり、各「actorID」は対応する「movieID」親要素内で一意です。

これは、両方の映画のリストに俳優の名前を表示する私のXSLTコードです。

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

<xsl:template match="name">
      <xsl:element name="a">
          <xsl:attribute name="href">actor_details.cfm?actorID=<xsl:value-of select="../@actorID"/></xsl:attribute>
          <xsl:value-of select="." />
      </xsl:element>
      <xsl:element name="br" />
</xsl:template>

6つのアクターの名前はすべて、対応する「ActorID」に基づいてactor_details.cfmページにハイパーリンクされています。

これは私のactor_details.cfmコードです:

<cfset MyXmlFile = Expandpath("movies.xml")>
<cffile action="READ" variable="xmlInput"  file="#MyXmlFile#">
<cfset MyXslFile = Expandpath("actor_details.xsl")>
<cffile action="READ" variable="xslInput"  file="#MyXslFile#">

<cfset xslParam = StructNew() >
<cfset xslParam["actorID"] = "#url.actorID#" >

<cfset xmlOutput = XMLTransform(xmlInput, xslInput, xslParam )>
<!--- data is output --->
<cfcontent type="text/html" reset="yes">
<cfoutput>#xmloutput#</cfoutput>

そしてこれは私のactor_details.xslコードです

<xsl:param name="actorID">1</xsl:param>

<xsl:template match="/">
    <title>Actor details</title>
    <xsl:apply-templates select="/movies/movie/actors/actor[@actorID=$actorID]"/>
</xsl:template>

<xsl:template match="actor">
    <xsl:text>Name: </xsl:text>
    <xsl:value-of select="name"/>
    <xsl:element name="br"/>
    <xsl:text>Age: </xsl:text>
    <xsl:value-of select="age"/>
    <xsl:element name="br"/>
</xsl:template>

ページに表示されている6人の俳優の名前のいずれかをクリックすると、俳優の「名前と年齢」が表示されている特定のactor_detailsページに移動します。私が抱えている唯一の問題は、2つの映画にID 1の俳優が2人、ID 2の俳優が2人、ID3の俳優が2人いることです。

したがって、Bob(actorID = "1")をクリックすると、その特定のactorIDの詳細ページに移動します。ただし、ボブの情報(名前と年齢)だけでなく、マイクの情報も表示されます。

その理由は、マイクの詳細が別の映画要素内にあることを除いて「actorID = "1"にも関連しているためです。私のプログラムでは、別のMovieIDにある同じActorIDの違いを区別できません。関連するすべての情報が表示されるだけです。その特定のIDに。したがって、BobまたはMike(どちらもactorID = "1")をクリックしても、ページにはBobとMikeの両方の情報(名前と年齢)が表示されます。

これは、actor_detailsページに表示されるものです。

俳優ページ

これは、actor_detailsページに表示したいものです。

俳優ページ2

したがって、BobとMikeのActorIDは同じですが、それらは異なるMovieIDに関連しているため、それらの情報を別々に表示したいと思います。

4

1 に答える 1

2

2つのオプションがあります。ハイパーリンクのパラメータとしてMovieIDを渡すか、次のようにします。

<xsl:attribute name="href">actor_details.cfm?movieID=<xsl:value-of select="../../../@movieID"/>&amp;actorID=<xsl:value-of select="../@actorID"/></xsl:attribute>

または、各俳優に一意のIDを定義します(各映画内ではありません)。

 <movie movieID="17">
     <actors>
          <actor actorID="17_1">...</actor>
          <actor actorID="17_2">...</actor>
 ...

最初のオプションを使用する場合は、actor_details.xslを少し変更する必要があります。

<xsl:param name="movieID"/>
...
<xsl:apply-templates select="/movies/movie[@movieID=$movieID]/actors/actor[@actorID=$actorID]"/>
于 2013-03-15T20:43:06.780 に答える