【问题标题】:Display an XML child element information based on its unique ID根据其唯一 ID 显示 XML 子元素信息
【发布时间】:2013-03-16 04:43:06
【问题描述】:

我有一个存储电影及其演员的 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 个“演员”子元素。每个“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 个演员的名字都根据他们对应的“演员 ID”超链接到 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 的演员。

所以当我点击 Bob (actorID="1") 时,它会将我带到那个特定的 actorID 详细信息页面。但不仅仅是显示 Bob 信息(姓名和年龄),它还显示 Mike 信息。

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

这是 actor_details 页面显示的内容:

这就是我希望 actor_details 页面显示的内容:

因此,即使 Bob 和 Mike 具有相同的 ActorID,它们与不同的 MovieID 相关,因此,我想分别显示他们的信息。

【问题讨论】:

    标签: xml xslt xpath coldfusion hyperlink


    【解决方案1】:

    你有两个选择。您可以在超链接中将 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]"/>
    

    【讨论】:

    • 第一个选项看起来是一个更好的解决方案,但是由于某种原因,当我点击演员的名字时,ColdFusion 报告了一个意外错误。它与我的 actor_details.cfm 文件代码有关吗?
    • 对不起,我从未使用过 ColdFusion :)。您是否尝试在该文件中添加另一行,就像您已经拥有的一样? &lt;cfset xslParam["movieID"] = "#url.movieID#" &gt;
    • 我已通过将 添加到我的 CFM 文件并将 添加到我的XSL 文件。所以现在一切正常。您的解决方案对我帮助很大。非常感谢!
    猜你喜欢
    • 1970-01-01
    • 2014-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多