【发布时间】:2011-04-06 00:37:04
【问题描述】:
总结:我正在使用xslt来转换数据,需要生成一些里面有CDATA的标签和一些没有的标签。转义 CDATA 部分是我唯一的选择吗?
我正在尝试将 xml 中已有的数据转换为 Moodle Xml 以进行导入。最终产品需要包含一些 Html,Moodle Xml doc 明确表示需要包含在 CDATA 中。
所需的输出:
<question>
<name>
<text>FooName</text>
</name>
<questiontext format="html">
<text><![CDATA[<img src="1.png">]]></text>
</questiontext>
</question>
我尝试使用以下代码(精简,但将包含来自我的输入 xml 文件的数据):
方法一,没什么特别的
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/>
<xsl:template match="/">
<question>
<name>
<text>FooName</text>
</name>
<questiontext format="html">
<text><![CDATA[<img src="1.png">]]></text>
</questiontext>
</xsl:template>
</xsl:stylesheet>
得到了……
方法 1 的错误输出
<question>
<name>
<text>FooName</text>
</name>
<questiontext format="html">
<text><img src="1.png"></text>
</questiontext>
</question>
所以我查找了xslt documentation 和some SO questions,这似乎说我有两个选择:
- 什么都不做,CDATA 被转义。
- 使用
cdata-section-elements ="text"在标签内自动生成cdata部分 - 使用
disable-output-escaping="yes"手动生成CDATA部分
好的,自动生成听起来不错。让我们试试吧:
方法二添加cdata-section-elements="text"
<xsl:output method="xml" indent="yes" omit-xml-declaration="yes" cdata-section-elements="text"/>
来自cdata-section-elements ="text"的错误输出:
<question>
<name>
<text><![CDATA[FooName]]></text>
</name>
<questiontext format="html">
<text><![CDATA[<img src="1.png">]]></text>
</questiontext>
</question>
所以 2 不是一个选项,因为在我无法控制的架构中,我不想包含 CDATA 的其他元素。
这给我留下了选项 3,手动逃脱。那么我的问题是:选项 3 是我唯一的选择吗?我还能做些什么来使用 XSLT 获得我想要的输出吗?不使用 XSLT?
【问题讨论】:
-
您是否验证过使用方法 2 (
cdata-section-elements="text") 会破坏 Moodle?如果它正确解析 XML,那么“额外”的 CDATA 部分就不会打扰它。实际上,如果它正确解析 XML,那么它也应该处理转义的 HTML。如果这些都不起作用,那么问题出在 Moodle 上,而不是 XML 或 XSLT。