2013-03-15 57 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