【问题标题】:Remove some <br /> tags from XML weather feed从 XML 天气提要中删除一些 <br /> 标签
【发布时间】:2012-08-11 08:40:23
【问题描述】:

我正在尝试通过 RSS XML 在我的网站上格式化天气提要,这很容易实现。问题是它会在页面上呈现级联,我想让它在页面上运行。

据我所知,我似乎需要删除 &lt;br /&gt;&lt;br /&gt; 标记,以便它们彼此对齐。

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

我将如何在每天之后删除 &lt;br /&gt;&lt;br /&gt; 标签,使它们彼此相邻对齐,但保留其他单数 &lt;br&gt; 标签?

【问题讨论】:

  • 提供的“源 XML”没有任何元素名称(rsschannelitemtitledescription)。请编辑问题并提供真实源XML文档。

标签: html xslt rss tags


【解决方案1】:

正如其他人已经指出的那样,想要的转换是不可能的,除非删除 CDATA 部分(使标记只是常规的、普通的、一维文本)


这个完整的转变

<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. identity rule“按原样”复制每个匹配的节点,并为其选择执行。

  2. 有一个覆盖标识模板的模板。它匹配任何br,其第一个兄弟(前兄弟或后兄弟)不是纯空格文本节点,也是br

    李>
  3. 此覆盖模板的主体为空,可有效地从输出中“删除”任何匹配的 br 元素。

【讨论】:

  • 我认为您已经屈服于复制粘贴的野兽,因为输出 XML 似乎与输入 XML 相同......
  • @TimC,感谢您注意到这一点——现已修复。有时我的键盘对 Ctrl+C 没有反应,然后粘贴使用以前复制的文本,而不是我认为应该粘贴的文本。
【解决方案2】:

首先,不要将 XML 放在 CDATA 部分中,除非其他方强迫您这样做。

假设您已将 XML 内容移至 CDATA 部分之外,请应用具有标识转换和此模板的 XSLT 样式表 ....

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

此模板将删除相邻的
元素。如果两个
之间有任何文本,即使只是空格,
也不会被删除。


注意

这个解决方案是错误的。请参阅 Dimitre 的回答。

【讨论】:

  • 肖恩,不幸的是,建议的解决方案没有产生想要的结果。
猜你喜欢
  • 2021-09-29
  • 2018-08-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多