XSLT条件比较不同元素之间的属性

时间:2019-06-18 19:28:32

标签: xml xslt

考虑XML文件:

 <collection>

    <director id="d1">
      <name>Michael Bay</name>
    </director>

    <director id="d2">

      <name>Quentin Tarantino</name>

    </director>

    <movie directors="d1">
      <title>Explosions</title>
    </movie>

    <movie directors="d1 d2">
      <title>Blood and Explosions</title>
    </movie>

 </collection>

我希望XSLT(XSLT 1.0)将其转换为所有导演的列表,并列出他们执导的所有电影的子列表。

应该是这样的:

    <ul>
      <li>Quentin Tarantino
        <ul><li>Blood and Explosions</li></ul>
      </li>
      <li>Michael Bay
        <ul>
         <li>Explosions</li>
         <li>Blood and Explosions</li>
        </ul>
      </li>
    </ul>

我尝试使用for-each和if语句,但是我不知道如何比较@id和@directors。

这是我到目前为止所拥有的:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="xs"
version="1.0">

<xsl:template match="/">

    <html>
        <body>
            <h3>Directors</h3>
            <xsl:apply-templates/>
        </body>
    </html>


</xsl:template>

<xsl:template match="director">

    <xsl:for-each select="//movie">

    </xsl:for-each>

</xsl:template>

有什么建议吗?

1 个答案:

答案 0 :(得分:1)

您要为导演选择电影的表情是这样。

<xsl:for-each select="../movie[contains(concat(' ', @directors, ' '), concat(' ', current()/@id, ' '))]">

此处使用concat是为了避免在电影中拥有d12导演的位置,因此您要避免与其匹配的d1(因为d12包含{ {1}})

尝试使用此XSLT

d1

(请注意使用<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="xs" version="1.0"> <xsl:template match="/collection"> <html> <body> <h3>Directors</h3> <ul> <xsl:apply-templates select="director" /> </ul> </body> </html> </xsl:template> <xsl:template match="director"> <li> <xsl:value-of select="name" /> <ul> <xsl:for-each select="../movie[contains(concat(' ', @directors, ' '), concat(' ', current()/@id, ' '))]"> <li> <xsl:value-of select="title" /> </li> </xsl:for-each> </ul> </li> </xsl:template> </xsl:stylesheet> ,因为否则使用<xsl:apply-templates select="director" />将选择所有子节点,并且由于XSLT的内置模板,您最终会得到{{1}中的文本}被输出到您不想要的位置。

如果您可以使用XSLT 2.0,则可以使用<xsl:apply-templates />来简化操作:

movie