最简单的XSLT,用于根据子节点属性值过滤节点

时间:2013-03-14 10:06:17

标签: xslt xpath

我想使用XSLT复制mrss xml,但是使用XSLT过滤test属性中没有label值的项目。

这是我到目前为止所做的:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:media="http://search.yahoo.com/mrss/"> 
    <xsl:template match="/">
        <rss xmlns:media="http://search.yahoo.com/mrss/" version="2.0">
            <channel><xsl:apply-templates/></channel>
        </rss>      
    </xsl:template>

   <xsl:template match="channel/item[contains(media:category/@label,'test')] | channel/*[not(self::item)]">
        <xsl:copy-of select="."/>
   </xsl:template>

   <xsl:template match="channel/item[not(contains(media:category/@label,'test'))]">
   </xsl:template>
</xsl:stylesheet>

我不喜欢的三件事:

  • 用于过滤不匹配项目的空模板,
  • rsschannel元素已存在于源XML中,但我仍需要将其放入XSL文件中
  • 我认为有些事情可以用单个XPath表达式完成,但我不知道足够的XPath和XSLT。

有人可以建议更好/更简单的解决方案吗?

1 个答案:

答案 0 :(得分:3)

是的,更好的方法是从身份模板开始,然后从那里开始。以下应该是您所需要的:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                              xmlns:media="http://search.yahoo.com/mrss/">
  <xsl:output method="xml" indent="yes"/>
  <xsl:strip-space elements="*" />

  <xsl:template match="@* | node()">
    <xsl:copy>
      <xsl:apply-templates select="@* | node()"/>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="channel/item[not(contains(media:category/@label,'test'))]" />
</xsl:stylesheet>