0

RSS XMLを介して自分のサイトで天気予報フィードをフォーマットしようとしていますが、これは簡単に実現できます。問題は、ページをカスケードしてレンダリングすることです。ページ全体で実行したいと思います。

<br /><br />私が収集できることから、タグを削除して、タグが互いに隣接するようにする必要があるように見えます。

XMLソースは次のようになります。

<description>
    <![CDATA[ <b>Wednesday</b>
    <br />
    <img src="/images/icons/fcast_30/mostly_cloudy.gif">
    <br /> Mostly cloudy<br /> -1&#176;C - 14&#176;C
    <br /><br />
    <b>Thursday</b>
    <br />
    <img src="/icons/fcast_30/frost_then_sunny.gif">
    <br /> Frost then sunny<br /> 1&#176;C - 13&#176;C
    <br /><br />
    <b>Friday</b>
    <br />
    <img src="/images/icons/fcast_30/rain.gif">
    <br /> Rain<br /> 2&#176;C - 11&#176;C
    <br /><br />
    <b>Saturday</b>
    <br />
    <img src="/images/icons/fcast_30/clearing_shower.gif">
    <br /> Clearing shower<br /> 0&#176;C - 12&#176;C
    <br /><br /> ]]>
</description>

私の出力XSLコードは次のようになります。

<xsl:for-each select="rss/channel">
    <xsl:value-of select="(item/title)[2]"/>
    <xsl:value-of select="substring((item/description)[1],30,15)" disable-output-escaping="yes"/>
    <xsl:value-of select="(item/description)[2]" disable-output-escaping="yes"/>
</xsl:for-each>

そして、出力は次のようにレンダリングされます。

水曜日
IMG.gif
おおむね曇り
-1°C-14°C

木曜日
IMG.gif
霜が降りて晴れ
1°C-13°C

金曜日
IMG.gif

2°C-11°C

土曜日
IMG.gif
クリアシャワー
0°C- 12°C

<br /><br />毎日タグを削除して、タグを並べて配置し、他の単一の<br>タグは残しておくにはどうすればよいですか?

4

2 に答える 2

1

他の人がすでに指摘しているように、CDATAセクション(マークアップを通常のプレーンな1次元テキストにする)を削除しない限り、必要な変換は不可能です


この完全な変換

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

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

 <xsl:template match=
 "br[preceding-sibling::node()
       [self::* or self::text()[normalize-space()]
        ][1]
        [self::br]
    or
     following-sibling::node()
       [self::* or self::text()[normalize-space()]
        ][1]
        [self::br]
    ]"/>
</xsl:stylesheet>

CDATAセクションを削除し、多数の不正なエラーを修正した後に取得したXMLドキュメントに適用した場合

<description>
        <b>Wednesday</b>
        <br />
        <img src="/images/icons/fcast_30/mostly_cloudy.gif"/>
        <br /> Mostly cloudy<br /> -1&#176;C - 14&#176;C
        <br /><br />
        <b>Thursday</b>
        <br />
        <img src="/icons/fcast_30/frost_then_sunny.gif"/>
        <br /> Frost then sunny<br /> 1&#176;C - 13&#176;C
        <br /><br />
        <b>Friday</b>
        <br />
        <img src="/images/icons/fcast_30/rain.gif"/>
        <br /> Rain<br /> 2&#176;C - 11&#176;C
        <br /><br />
        <b>Saturday</b>
        <br />
        <img src="/images/icons/fcast_30/clearing_shower.gif"/>
        <br /> Clearing shower<br /> 0&#176;C - 12&#176;C
        <br /><br />
</description>

必要な正しい結果を生成します

<description>
   <b>Wednesday</b>
   <br/>
   <img src="/images/icons/fcast_30/mostly_cloudy.gif"/>
   <br/> Mostly cloudy<br/> -1°C - 14°C
            <b>Thursday</b>
   <br/>
   <img src="/icons/fcast_30/frost_then_sunny.gif"/>
   <br/> Frost then sunny<br/> 1°C - 13°C
            <b>Friday</b>
   <br/>
   <img src="/images/icons/fcast_30/rain.gif"/>
   <br/> Rain<br/> 2°C - 11°C
            <b>Saturday</b>
   <br/>
   <img src="/images/icons/fcast_30/clearing_shower.gif"/>
   <br/> Clearing shower<br/> 0°C - 12°C
            </description>

説明

  1. IDルールは、実行対象として選択された、一致したすべてのノードを「現状のまま」コピーします。

  2. IDテンプレートをオーバーライドする単一のテンプレートがあります。これは、空白のみのテキストノードではない最初の兄弟(前の兄弟または後の兄弟のいずれか)もbrであるすべてに一致します。br

  3. brこのオーバーライドするテンプレートの本文は空であり、一致する要素を出力から効果的に「削除」します。

于 2012-08-15T02:23:58.543 に答える
0

まず第一に、他の当事者によって強制されない限り、XMLをCDATAセクション内に配置しないでください

XMLコンテンツをCDATAセクションの外に移動したと仮定して、ID変換とこのテンプレートを使用してXSLTスタイルシートを適用します...。

<xsl:template match="br[
  preceding-sibling::node()[self::br] |
  following-sibling::node()[self::br] ]" />

このテンプレートは、隣接する<br>要素を削除します。2つの<br>の間にテキストがある場合、空白だけでも、<br>は削除されません。


ノート

この解決策は間違っています。ディミトレの答えを参照してください。

于 2012-08-15T01:00:47.627 に答える