Xslt 产生一些;带有 CDATA 和一些的标签标签没有?
摘要:我正在使用xslt 来转换数据,并且需要生成一些内部带有CDATA 的标签和一些不带有CDATA 的标签。转义 CDATA 部分是我唯一的选择吗?
我正在尝试将 xml 中已有的数据转换为 Moodle Xml 进行导入。最终产品需要包含一些 Html,Moodle Xml 文档明确指出需要包含这些 Html在 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 文档 和一些 SO 问题,这似乎说我有两个选择:
- 什么也不做,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"
输出错误code>:
<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?
Summary: I'm using xslt to convert data, and need to produce some tags with CDATA inside and some tags without. Is escaping the CDATA sections my only option?
I'm attempting to convert data I already have in xml to Moodle Xml for importing. The final product needs to include some Html, which the Moodle Xml doc specifically says needs to be contained in CDATA.
Desired Output:
<question>
<name>
<text>FooName</text>
</name>
<questiontext format="html">
<text><![CDATA[<img src="1.png">]]></text>
</questiontext>
</question>
I gave this a try using the following code (trimmed down, but will include the data from my input xml file):
Method 1, nothing special
<?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>
And got...
Bad Output from Method 1
<question>
<name>
<text>FooName</text>
</name>
<questiontext format="html">
<text><img src="1.png"></text>
</questiontext>
</question>
So I look up the xslt documentation and some SO questions, which seem to say I have 2 options:
- Do nothing, CDATA gets escaped.
- use
cdata-section-elements ="text"
to auto-generate cdata sections inside tags - Generate CDATA sections by hand, using
disable-output-escaping="yes"
Ok, autogeneration sounds good. Lets try that:
Method 2 adding cdata-section-elements="text"
<xsl:output method="xml" indent="yes" omit-xml-declaration="yes" cdata-section-elements="text"/>
Bad Output from cdata-section-elements ="text"
:
<question>
<name>
<text><![CDATA[FooName]]></text>
</name>
<questiontext format="html">
<text><![CDATA[<img src="1.png">]]></text>
</questiontext>
</question>
So 2 isn't an option because there are other elements I do NOT want containing CDATA, in a schema I don't control.
This leaves me with option 3, escaping it by hand. My question then is: Is option 3 my only option? Is there anything else I can do to get my desired output using XSLT? not using XSLT?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
我在 http://neehouse.com/code/xslt/cdata_string_output.aspx< 上找到了此方法/a>
代码
输出
I've found this method on http://neehouse.com/code/xslt/cdata_string_output.aspx
Code
Output
正如您所注意到的,您的方法 1 和方法 2 没有产生您想要的结果。
由于对输出词法外观的要求极其奇怪且罕见,因此您只剩下第三种方法。
As you have noticed, your Method 1 and Method 2 do not produced the result you want.
Because of the extremely strange and rare requirement for the output lexical appearance, you are left with only the 3rd method.
正如 Dimitre 的回答,您的要求很奇怪,因为在 XML 元素中名称具有模式含义。如果
text
元素架构允许 CDATA,则所有text
元素都是如此。使用额外元素执行您想要的操作的一种方法:
输出(使用任何输入):
As Dimitre has answer, your requirement is strange because in XML elements names have schema meaning. If
text
elements schema allows CDATA, this is so for alltext
elements.One way to do what you want with extra element:
Output (with any input):