0

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

<movies
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="movies.xsd">

<movie movieID="1">
    <cast>
        <actors>
            <actor actorID="1">
                <name>Bob</name>
            </actor>
            <actor actorID="2">
                <name>John</name>
            </actor>
            <actor>
                <name>Mike</name>
            </actor>
        </actors>
    </cast>
</movie>

</movies>

前两个演员有一个具有唯一值的属性“actorID”。第三个演员没有属性。我想将前两个演员的名字显示为超链接,并将第三个演员的名字显示为纯文本。

这是我的 XSLT:

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

<xsl:template match="movie">    
    <xsl:text>Actors: </xsl:text>
    <xsl:apply-templates select="cast/actors/actor[@actorID]/name"/>
</xsl:template>

<xsl:template match="actor[@actorID]/name">
    <xsl:element name="a">
        <xsl:attribute name="href">www.mywebsite.com</xsl:attribute>
        <xsl:value-of select="." />
    </xsl:element>
    <xsl:element name="br" />
</xsl:template>

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

我得到的输出是 Bob 和 John 显示为纯文本,而 Mike 根本没有显示。因此,它的作用与我想要实现的目标完全相反。

4

1 回答 1

2

你的 XPath 在这里:

<xsl:apply-templates select="cast/actors/actor[@actorID]/name"/>

导致模板仅应用于具有actorID属性的演员。相反,听起来这是您应该使用的:

<xsl:apply-templates select="cast/actors/actor/name"/>

然后 XSLT 应该像您期望的那样运行。

作为旁注,我建议在 XSLT 中使用文字元素,除非需要使用xsl:element

<xsl:template match="actor[@actorID]/name">
    <a href="http://www.mywebsite.com">
        <xsl:value-of select="." />
    </a>
    <br />
</xsl:template>

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

它使 XSLT 更容易阅读恕我直言。如果需要在属性中包含值,可以使用属性值模板:

<a href="http://www.mywebsite.com/actors?id={../@actorID}">
于 2013-04-02T20:49:04.400 回答