2

私は xsl にかなり慣れていないので、wordpress の rss フィードの xml 内の 2 つを除くすべてのノードを次のように非表示またはミュートする方法を見つけようとしています。

?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
xmlns:content="http://purl.org/rss/1.0/modules/content/"
xmlns:wfw="http://wellformedweb.org/CommentAPI/"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:atom="http://www.w3.org/2005/Atom"
xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
>
<channel>
    <title>Title</title>
    <atom:link href="http://www.alink.com" rel="self" type="application/rss+xml" />
    <link>http://www.alink.com</link>
    <description>Just another WordPress site</description>
    <lastBuildDate>Sun, 21 Apr 2013 22:13:55 +0000</lastBuildDate>
    <language>en-US</language>
    <sy:updatePeriod>hourly</sy:updatePeriod>
    <sy:updateFrequency>1</sy:updateFrequency>
    <generator>http://wordpress.org/?v=3.5.1</generator>

    <item>
        <title>A Title</title>
        <link>http://www.alink.com</link>
        <comments>comments</comments>
        <pubDate>Sun, 21 Apr 2013 22:13:55 +0000</pubDate>
        <dc:creator>aUser</dc:creator>
        <category><![CDATA[Uncategorized]]></category>
        <guid isPermaLink="false">http://www5.uifoundation.org/news/?p=112</guid>
        <description><![CDATA[Post[...]]]></description>
        <content:encoded> Posted October 10, 2013 </content:encoded>
        <wfw:commentRss>http://www.alink.com</wfw:commentRss>
        <slash:comments>0</slash:comments>
    </item>

しかし、変換でチャンネル/タイトルとチャンネル/リンクのみを表示したいです。このように、すべてのノードで空のテンプレートを使用するという行に沿って何かを考えていました

<xsl:template match="channel/* EXCEPTION channel/item/title | channel/item/link" />

ただし、例外を宣言する方法がわかりません。これを行うためのより良い方法があれば、私もそれを受け入れます

私は本当に、出力が の順序付けられていないリストでありitem/title、 の値がありitem/link、他のすべてが隠されていることを望んでいます。出力の例は次のとおりです。

<ul>
  <li>
    <a href= "www.aLink.com">A Title</a>
  </li>
</ul> 
4

1 に答える 1

5

別のテンプレートを使用してそれを行うことができます。その一部は空で、優先度が異なります。

<xsl:template match="channel/*" priority="0" /> <!-- swallow these, no output -->

<xsl:template match="channel/item | channel/link" priority="1">
   <xsl:copy-of select="." /> <!-- copy to output -->
</xsl:template>

channel/itemとの場合、channel/link優先度が高いため、2 番目のテンプレートが最初のテンプレートをオーバーライドします。の他の子の場合channel、最初のテンプレートが起動します。

(テンプレートには、一致パターンのタイプに基づいたデフォルトの優先度があることに注意してください。また、優先度が等しい 2 つのテンプレートが同じノードに一致した場合にどうするかについてのルールもあります。同じノードに一致する場合、それらの見えないルールをいじる必要はありません。)

と の処理方法を指定する他のテンプレートがない場合<rss><channel>デフォルトのテンプレートが適用され、テキスト ノードを除いて処理されますが、出力にはコピーされません。それは少し混乱するでしょう。これら 2 つの要素 (ただし、そのすべての子孫ではない) を出力にコピーする場合は、次のテンプレートを試してください。

<xsl:template match="rss | channel">
  <xsl:copy>
    <xsl:apply-templates />
  </xsl:copy>
</xsl:template>

編集

目的の出力が指定されたので、アプローチは完全に異なるはずです。最初のテンプレートは次のとおりです。

<xsl:template match="/">
  <ul>
    <xsl:apply-templates select="rss/channel/item" />
  </ul>
</xsl:template>

2 番目のテンプレートは、各アイテムを次のように変換します<li>

<xsl:template match="item">
  <li>
    <a href="{link}"><xsl:value-of select="title" /></a> 
  </li>
</xsl:template>

これは、「押す」というよりはむしろ「引く」アプローチです。入力から特定のノードが必要であり、入力の構造は非常に予測可能です。一般的な の代わりに特定の apply-templates select 式を使用すると、<xsl:apply-templates select="*" />選択したノードのみが処理されるため、例外テンプレートが不要になります。

于 2013-04-22T14:43:43.697 に答える