总结:我正在使用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文件中的数据):
方法1,没什么特别的
<?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-section-elements ="text"
在代码disable-output-escaping="yes"
好的,自动生成听起来不错。让我们尝试:
方法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?
答案 0 :(得分:5)
我在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>
答案 1 :(得分:0)
正如您所注意到的,您的方法1和方法2不会产生您想要的结果。
由于对输出词法外观的极其奇怪和罕见的要求,你只剩下第3种方法。
答案 2 :(得分:0)
正如Dimitre所说,你的要求很奇怪,因为在XML元素名称中有模式含义。如果text
元素架构允许CDATA,则所有text
元素都是如此。
使用额外元素执行所需操作的一种方法:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xhtml="http://www.w3.org/1999/xhtml">
<xsl:output cdata-section-elements="xhtml:div"/>
<xsl:template match="/">
<question>
<name>
<text>FooName</text>
</name>
<questiontext format="html">
<text>
<xhtml:div><![CDATA[<img src="1.png">]]></xhtml:div>
</text>
</questiontext>
</question>
</xsl:template>
</xsl:stylesheet>
输出(带任何输入):
<question xmlns:xhtml="http://www.w3.org/1999/xhtml">
<name>
<text>FooName</text>
</name>
<questiontext format="html">
<text>
<xhtml:div><![CDATA[<img src="1.png">]]></xhtml:div>
</text>
</questiontext>
</question>