XSLT排除不需要的输出

时间:2012-08-15 12:15:32

标签: html xml xslt

我在排除xlst转换中不需要的输出时遇到了一些问题。 我已经知道匹配等背后的默认规则,但我无法正确使用模板/应用模板中的匹配 你能帮我解决这个问题吗?

所以我有一个以这种方式构建的XML文件:

<movies>
    <movie id="0">
        <title>Title</title>
        <year>2007</year>
        <duration>113</duration>
        <country>Country</country>
        <plot>Plot</plot>
        <poster>img/posters/0.jpg</poster>
        <genres>
            <genre>Genre1</genre>
            <genre>Genre2</genre>
        </genres>
        ...
    </movie>
    ...
</movies>

我想创建一个带有LI的html UL列表,每个属于一个类型的电影'#######'(在运行时由我的perl脚本替换),这是一个指向页面的链接(命名为由它的id)。

现在我正是这样做的:

<xsl:template match="/">
    <h2> List </h2>
    <ul>
        <xsl:apply-templates match="movie[genres/genre='#######']"/>
            <li>
                <a>
                    <xsl:attribute name="href">     
                        /movies/<xsl:value-of select= "@id" />.html
                    </xsl:attribute>
                    <xsl:value-of select= "title"/>
                </a>
            </li>
    </ul>
</xsl:template>

显然,这种方式向我展示了与所选流派相匹配的所有电影元素。 我是否必须添加大量<xsl:template match="...">以删除所有额外输出?
你能告诉我创建像这样的html片段的正确方法吗?     

列表

    
            
  •             Title0         
  •         
  •             Title2         
  •         
  •             Title7         
  •     
提前谢谢!

2 个答案:

答案 0 :(得分:4)

Dash的解决方案是正确的。

我建议电影模板略有变化,以便更简洁......

<xsl:template match="movie">
  <li>
    <a href="/movies/{@id}.html">
      <xsl:value-of select= "title"/>
    </a>
  </li>
</xsl:template>

答案 1 :(得分:1)

你几乎就在那里 - 你使用apply-templates会导致问题。

相反,以这种方式构建您的XSLT:

  <xsl:template match="/">
    <h2> List </h2>
    <ul>
      <xsl:apply-templates select="movie[genres/genre='#######']"/>
    </ul>
  </xsl:template>

  <xsl:template match="movie">
    <li>
      <a>
        <xsl:attribute name="href">/movies/<xsl:value-of select= "@id" />.html</xsl:attribute>
        <xsl:value-of select= "title"/>
      </a>
    </li>
  </xsl:template>

它会将特定模板(match =“movie”)应用于您的影片元素。在您最初的尝试中,您将使用default template,它将带回电影元素中包含的所有内容。