基于子节点属性值筛选节点的最简单XSLT

基于子节点属性值筛选节点的最简单XSLT,xslt,xpath,Xslt,Xpath,我想使用XSLT复制mrss xml,但使用XSLT过滤label属性中没有test值的项 以下是我迄今为止所做的: <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:med

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

以下是我迄今为止所做的:

<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>

有三件事我不喜欢:

  • 用于筛选不匹配项的空模板
  • rss
    channel
    元素已经存在于源XML中,但我仍然需要将其放入XSL文件中
  • 我认为有些事情可以用单个XPath表达式来完成,但我对XPath和XSLT了解不够

有人能提出更好/更简单的解决方案吗?

是的,更好的方法是从身份模板开始,然后从那里开始。以下是您所需的全部内容:

<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>


谢谢,它可以工作,唯一的问题是源代码中的元素有缩进,所以在删除的每个项目的位置上都有空行。如何修复它?添加
xsl:strip space
应该可以修复它。上面已修改。如何为两个单词添加OR筛选器?仅“运动”或“自然”类别中的项目?@aborruso要重复使用上述示例,您可以使用
channel/item[不(包含(媒体:category/@label,'sport')或包含(媒体:category/@label,'nature'))]
或使用
channel/item[不(媒体:category/@label[包含(,'sport'))或包含(,'nature')]