2013-03-15 52 views
0

我有一个存储电影及其演员的XML文件。根据其唯一ID显示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的演员位于两部电影中。

所以,当我点击鲍勃(actorId来=“1”),它带我到那个特定的actorId详细信息页面。但不仅仅显示Bob的信息(姓名和年龄) ,还显示Mike的信息。

原因是因为Mike的细节也与“actorID =”1“有关,只不过 它位于另一个电影元素中,我的程序无法区分位于单独MovieID中的相同ActorID的区别。显示所有与该特定ID的信息。 所以不管我是否点击鲍勃和迈克(两人都的actorId =“1”),该页面显示的信息,鲍勃和迈克(他们的姓名和年龄)。

这是actor_details页面显示的内容:

actors page

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

actors page 2

因此,即使鲍勃和迈克有同样的actorId的,它们都涉及到不同的MovieID的,因此,我想显示他们的信息分别。

回答

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]"/> 
+0

第一个选项看起来像是一个更好的解决方案,但由于某种原因,当我单击actor的名称时,ColdFusion会报告一个意外错误。这与我的actor_details.cfm文件代码有关吗? Alex 2013-03-15 20:55:39

+0

对不起,我从来没有使用ColdFusion :)。你有没有试图添加另一行到该文件,就像你已经有的那个? '' – AJPerez 2013-03-16 05:48:45

+0

我已经通过向我的CFM文件添加 xsl:param name =“actorID”/>添加到我的XSL文件中。所以现在一切正常。你的解决方案对我非常有帮助。非常感谢! – Alex 2013-03-16 13:11:56