根据其唯一ID显示XML子元素信息

时间:2013-03-15 20:30:08

标签: xml xslt xpath coldfusion hyperlink

我有一个存储电影及其演员的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>

从上面的代码中可以看出,我有2个“电影”元素,其中包含3个“actor”子元素。每个“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页面。 我唯一的问题是有两个ID为1的演员,两个ID为2的演员和两个ID为3的演员位于2部电影中。

因此,当我点击Bob(actorID =“1”)时,它会将我带到特定的actorID详细信息页面。而不是只显示 Bob信息(姓名和年龄),它还显示Mike信息。

原因是因为Mike的细节也与“actorID =”1“有关,除此之外 它位于另一个电影元素中。我的程序无法区分位于不同MovieID中的相同ActorID之间的差异。它只显示与该特定ID相关的所有信息。 所以无论我点击Bob还是Mike(两者都有actorID =“1”),该页面都会显示Bob和Mike的信息(他们的姓名和年龄)。

这是actor_details页面显示的内容:

actors page

这就是我想要显示的actor_details页面:

actors page 2

所以尽管Bob和Mike有相同的ActorID,但它们与不同的MovieID相关,因此,我想分别显示他们的信息。

1 个答案:

答案 0 :(得分:2)

您有两种选择。您将MovieID作为超链接中的参数传递:

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

或者,您为每个actor定义唯一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]"/>