2

testmrss xml のコピーに XSLT を使用したいのですが、XSLT を使用して属性に値を持たないアイテムをフィルター処理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>

その中で私が気に入らない3つのこと:

  • 一致しないアイテムをフィルタリングするための空のテンプレート、
  • rss、およびchannel要素はソース XML に既に存在しますが、それを XSL ファイルに入れる必要があります。
  • 単一の XPath 式でできることもあると思いますが、XPath と XSLT について十分な知識がありません。

誰かがより良い/簡単な解決策を提案できますか?

4

1 に答える 1

3

はい、より良いアプローチは、ID テンプレートから始めて、そこから始めることです。必要なものは次のとおりです。

<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 に答える