【问题标题】:Parse HTML inside the CDATA text在 CDATA 文本中解析 HTML
【发布时间】:2013-04-18 15:14:55
【问题描述】:

CDATA 中要解析为 Html 的数据。

<?xml version="1.0" encoding="utf-8" ?>
<test>
  <test1>
    <![CDATA[ &lt;B&gt; Test Data1 &lt;/B&gt; ]]>
  </test1>

  <test2>
    <![CDATA[ &lt;B&gt; Test Data2 &lt;/B&gt; ]]>
  </test2>

  <test3>
    <![CDATA[ &lt;B&gt; Test Data3 &lt;/B&gt; ]]>
  </test3>
 </test>

从上面的输入 xml 我需要将输出解析为 html。

但我得到的输出为

<B>Test Data1</B>
<B>Test Data2</B>
<B>Test Data3</B>

但实际输出我需要将文本加粗。

**Test Data1
Test Data2
Test Data3**

输入来自外部系统。我们无法更改 CDATA 中的文本

【问题讨论】:

  • 您的 XSLT 是什么样的?
  • Rishe,我有一个很大的 xslt 和其他场景。这个场景是我的 xslt 的一部分。
  • 我正在使用 xslt 1.0 和 Visual Studio 编辑器。
  • 你的输入真的像你的例子吗?在 cdata 中转义 html?也许这会有所帮助:stackoverflow.com/questions/2067116/…
  • @hr_117 是的。看起来一样。

标签: xslt xslt-1.0


【解决方案1】:

解析为 HTML 只能使用扩展函数(或使用 XSLT 2.0 和用 XSLT 2.0 编写的 HTML 解析器),但如果您想创建 HTML 输出并将 testX 元素的内容输出为 HTML,那么你可以这样做,例如

<xsl:template match="test/*[starts-with(local-name(), 'test')]">
  <xsl:value-of select="." disable-output-escaping="yes"/>
</xsl:template>

但请注意,disable-output-escaping 是可选的序列化功能,并非所有用例中的所有 XSLT 处理器都支持。例如,Mozilla 浏览器中的客户端 XSLT 不受支持。

【讨论】:

  • 嗨 Honnen,如果运行 Xslt,结果将显示为 Test Data1 Test Data2 Test Data3 。但我需要以粗体显示。
  • 是的,抱歉,我忽略了您的输入数据同时使用了 CDATA 部分和实体引用,因此我的建议不起作用。如果你有例如&lt;test1&gt;&lt;![CDATA[&lt;b&gt;Test data&lt;/b&gt;]]&gt;&lt;/test1&gt;,那么禁用输出转义就可以了。您能告诉我们您想使用哪个 XSLT 处理器来解决这个问题吗?您是否在 Visual Studio 中进行开发,并且想要使用 .NET 的 XslCompiledTransform 编写一个 .NET 应用程序?
  • 还告诉我们更多关于输入格式的信息,最后一个样本有&lt;![CDATA[ &amp;lt;p&amp;gt; Test Data3 &amp;lt;/B&amp;gt; ]]&gt;p 被关闭为/B,这会使事情变得更加复杂,因为没有 SGML 和 XML 解析器都无法处理抛出错误。这是你发帖的错误吗?或者您真的需要处理带有此类错误的输入数据吗?
  • 对不起,Honnen,我编辑了我的输入文件。我错误地放置了 P 而不是 B。我在 Visual Studio 中使用 xml 编辑器,我没有使用任何 .net 代码。
【解决方案2】:

如果您必须继续使用 XSLT 1.0,则必须运行两次转换过程。

  1. 第一个复制您的 xml 但通过使用 disable-output-escaping="yes" 生成内容来删除 CDTA(请参阅 @Martin Honnen 的回答)

  2. 在第二个路径中,您可以访问 html 部分。

但这只有在 html 部分遵循格式良好的 xml (xhtml) 的角色时才有可能。如果不是,也许 xsltproc 中的输入开关可能有助于使用 html,例如:

 --html: the input document is(are) an HTML file(s)

另请参阅:Convert an xml element whose content is inside CDATA

【讨论】:

    猜你喜欢
    • 2013-06-27
    • 2012-01-01
    • 2012-08-17
    • 1970-01-01
    • 1970-01-01
    • 2013-02-04
    • 1970-01-01
    • 2012-08-02
    • 2011-04-08
    相关资源
    最近更新 更多