我正在尝试通过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°C - 14°C
<br /><br />
<b>Thursday</b>
<br />
<img src="/icons/fcast_30/frost_then_sunny.gif">
<br /> Frost then sunny<br /> 1°C - 13°C
<br /><br />
<b>Friday</b>
<br />
<img src="/images/icons/fcast_30/rain.gif">
<br /> Rain<br /> 2°C - 11°C
<br /><br />
<b>Saturday</b>
<br />
<img src="/images/icons/fcast_30/clearing_shower.gif">
<br /> Clearing shower<br /> 0°C - 12°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>
代码?
答案 0 :(得分: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°C - 14°C
<br /><br />
<b>Thursday</b>
<br />
<img src="/icons/fcast_30/frost_then_sunny.gif"/>
<br /> Frost then sunny<br /> 1°C - 13°C
<br /><br />
<b>Friday</b>
<br />
<img src="/images/icons/fcast_30/rain.gif"/>
<br /> Rain<br /> 2°C - 11°C
<br /><br />
<b>Saturday</b>
<br />
<img src="/images/icons/fcast_30/clearing_shower.gif"/>
<br /> Clearing shower<br /> 0°C - 12°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>
<强>解释强>:
identity rule 按“原样”复制每个匹配的节点,并为其选择执行。
有一个模板会覆盖身份模板。它匹配任何{em>第一个兄弟(兄弟之前或兄弟之后)的br
,它不是仅限空格的文本节点,也是br
。
此覆盖模板具有空主体,可有效地“删除”输出中任何匹配的br
元素。
答案 1 :(得分:0)
首先,不要将XML放入CDATA部分,除非您被其他方强迫这样做。
假设您已将XML内容移至CDATA部分之外,请应用带有标识转换和此模板的XSLT样式表....
<xsl:template match="br[
preceding-sibling::node()[self::br] |
following-sibling::node()[self::br] ]" />
此模板将删除相邻的&lt; br&gt;元素。如果两个&lt; br&gt;之间存在任何文本,即使只是空格,也不会删除&lt; br&gt; s。
这个解决方案是错误的。见Dimitre的回答。