我有一个客户端要求我提供的xml中的所有文本都在CDATA部分。我知道文本不应该在CDATA中,因为它已经被提供给客户端时已被解析和转换。但是,无论我多么确定,他们仍然需要CDATA部分。叹息。
我正在使用命令行转换命令处理Saxon 9.3的数据。
答案 0 :(得分:4)
当您的问题标题谈到XSLT并且您的问题被标记为XSLT时,确保结果元素的内容被序列化为CDATA部分的XSLT方法是使用cdata-section-elements
上的xsl:output
属性} element(http://www.w3.org/TR/xslt20/#serialization)列出要作为CDATA部分输出的所有元素。因此,如果您在编写样式表时知道要作为CDATA部分输出的元素,那么在该属性中列出它们就很简单。
这有帮助吗?或者您是否希望使用XSLT对任意XML进行后处理以添加CDATA部分?
答案 1 :(得分:2)
以下是完整示例:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"
cdata-section-elements="num"/>
<xsl:strip-space elements="*"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
将此转换应用于以下示例XML文档时:
<nums>
<num>01</num>
<num>02</num>
<num>03</num>
<num>04</num>
<num>05</num>
<num>06</num>
<num>07</num>
<num>08</num>
<num>09</num>
<num>10</num>
</nums>
结果包含所有文本节点(所有这些节点都是num
元素的子节点)在CDATA部分中表示:
<nums>
<num><![CDATA[01]]></num>
<num><![CDATA[02]]></num>
<num><![CDATA[03]]></num>
<num><![CDATA[04]]></num>
<num><![CDATA[05]]></num>
<num><![CDATA[06]]></num>
<num><![CDATA[07]]></num>
<num><![CDATA[08]]></num>
<num><![CDATA[09]]></num>
<num><![CDATA[10]]></num>
</nums>
<强>解释强>:
使用标识规则按原样输出每个节点。
使用cdata-section-elements
的{{1}}属性指定以空格分隔的元素列表,其文本节点子元素必须序列化为CDATA节。
请注意:在您的情况下,根本不会修改现有的转换,而是对其结果进行后处理,这与此示例类似。