【发布时间】:2014-12-08 21:50:19
【问题描述】:
我正在尝试编辑 CDATA 中的链接:
<paragraph>
<![CDATA[
<strong><a href="http://example.com/2014/12/08/article-title">Article Title</a></strong>Article Excerpt.
]]>
</paragraph>
目标是将段落更改为<p>,同时在链接内添加额外的标签。例如,所需的输出可以是:(不是所有的<paragraph> 都有链接,有些只包含文本)
<p>
<strong><a href="http://example.com/2014/12/08/article-title?tacking_id=12345" style="font-size:1.1em; color:#067ab4; line-height:100%">Article Title</a></strong>Article Excerpt.
</p>
我尝试了以下代码,但没有成功。
<xsl:template match="paragraph">
<xsl:copy-of select="@*"/>
<xsl:text disable-output-escaping="yes"><![CDATA[<p>]]></xsl:text>
<xsl:value-of select="." disable-output-escaping="yes"/>
<xsl:text disable-output-escaping="yes"><![CDATA[</p>]]></xsl:text>
</xsl:template>
<xsl:template match="text()[contains(.,'<a href="') and contains(.,'">')]">
<xsl:variable name="link" select="substring-before(substring-after(., '<a href="'), '">')"/>
<xsl:text disable-output-escaping="yes"><![CDATA[<a href="]]></xsl:text>
<xsl:value-of disable-output-escaping="yes" select="$link"/>
<xsl:text disable-output-escaping="yes"><![CDATA[&tracking_id=12345" ]]></xsl:text>
<xsl:value-of select="$link_style"/>
<xsl:text disable-output-escaping="yes"><![CDATA[>]]></xsl:text>
<xsl:apply-templates select="child::node()"/>
<xsl:text disable-output-escaping="yes"><![CDATA[</a>]]></xsl:text>
</xsl:template>
【问题讨论】:
-
CData 中没有元素 - 这就是它的用途!假设您将 SQL 中的一行读入一个 xml 文件,并且其中一个字段包含 HTML 及其所有 &wtf;实体、未终止的
标记和其他无效 XML。您将它放在 CData 部分中以防止 XML 尝试解析它。