2

我想使用 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>

我不喜欢其中的三件事:

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

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

4

1 回答 1

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>
于 2013-03-14T11:49:37.883 回答