摘要:我正在使用 xslt 来转换数据,并且需要生成一些包含 CDATA 的标签和一些不包含 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 ,这似乎表明我有 2 个选择:
- 什么都不做,CDATA 就会被转义。
- 使用
cdata-section-elements ="text"
在标签内自动生成cdata部分 - 使用
disable-output-escaping="yes"
手动生成 CDATA 部分
好的,自动生成听起来不错。让我们尝试一下:
方法 2 添加 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?
最佳答案
我在http://neehouse.com/code/xslt/cdata_string_output.aspx上找到了这个方法
代码
<no1>
<xsl:text disable-output-escaping="yes"><![CDATA[</xsl:text>
<xsl:value-of select="data/NO1"/>
<xsl:text disable-output-escaping="yes">]]></xsl:text>
</no1>
输出
<no1><![CDATA[xxxxxxxxxxxx]]></no1>
关于Xslt 生成一些带有 CDATA 的 <name> 标记和一些不带 CDATA 的 <name> 标记?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3605062/