0

我有以下存储电影和演员的 XML 文件:

<database
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="movies.xsd">
    <movies>
        <movie movieID="1">
            <title>Movie 1</title>
            <actors>
                <actor actorID="1"></actor>
                <actor actorID="2"></actor>
            </actors>
        </movie>
    </movies>

    <actors>
        <actor actorID="1">
            <name>Bob</name>
        </actor>
        <actor actorID="2">
            <name>Mike</name>
        </actor>
    </actors>
</database>

我想将 actorID fromdatabase/movies/movie/actors/actor与 actorID from连接起来database/actors/actor并显示演员的姓名:

这是我的 XSLT:

<xsl:variable name="selectActors" select="database/actors/actor[@actorID]"/>
<xsl:variable name="inputRoot" select="/"/>

<xsl:template match="/">
    <xsl:apply-templates select="database/movies/movie"/>
</xsl:template>

<xsl:template match="movie">
        Title:
        <xsl:value-of select="title"/>
        <br/>
        Actors:
        <xsl:for-each select="actors/actor[@actorID=$selectActors]">
            <xsl:value-of select="$inputRoot/database/actors/actor/name"/>
            <br/>
        </xsl:for-each>
        <br/>
</xsl:template>

这是我要显示的最终结果:

Title: Movie 1
Actors: Bob
    Mike

我无法让演员姓名显示在我的页面上。我不确定我是否正确地关联了我的 actorID,因为我通常对 XSLT 很陌生。

4

1 回答 1

1

for-each您的 XPath和您的 XPath 存在问题,value-of但比您尝试使用密钥的方法更有效(也更优雅):

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/>
  <xsl:key name="kActor" match="database/actors/actor" use="@actorID"/>

  <xsl:template match="/">
    <div>
      <xsl:apply-templates select="database/movies/movie"/>
    </div>
  </xsl:template>

  <xsl:template match="movie">
    <xsl:value-of select="concat('Title: ', title)"/>
    <br />
    <xsl:text>Actors: </xsl:text>
    <xsl:apply-templates select="key('kActor', actors/actor/@actorID)" />
    <br />
  </xsl:template>

  <xsl:template match="actor">
    <xsl:value-of select="name"/>
    <br />
  </xsl:template>
</xsl:stylesheet>

在您的示例输入上运行时,结果是:

<div>
  Title: Movie 1<br />Actors: Bob<br />Mike<br /><br />
</div>

为了让您可以看到您的 XPath 有什么问题,您可以通过以下方式修复现有解决方案以使其正常工作:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/>
  <xsl:variable name="selectActors" select="database/actors/actor"/>

  <xsl:template match="/">
    <div>
      <xsl:apply-templates select="database/movies/movie"/>
    </div>
  </xsl:template>

  <xsl:template match="movie">
    Title:
    <xsl:value-of select="title"/>
    <br/>
    Actors:
    <xsl:for-each
      select="$selectActors[@actorID = current()/actors/actor/@actorID]">
      <xsl:value-of select="name"/>
      <br/>
    </xsl:for-each>
    <br/>
  </xsl:template>
</xsl:stylesheet>
于 2013-04-10T22:07:20.903 回答