我有一个客户端需要我提供的所有文本都在CDATA部分。我知道文本不需要在CDATA中,因为它在提供给客户端时已经被解析和转换。但是,不管我有多确定,他们仍然需要CDATA部分。叹。如何强制xslt转换将数据加载到cdata节中?
我正在使用Saxon 9.3处理我的数据,使用命令行变换命令。
我有一个客户端需要我提供的所有文本都在CDATA部分。我知道文本不需要在CDATA中,因为它在提供给客户端时已经被解析和转换。但是,不管我有多确定,他们仍然需要CDATA部分。叹。如何强制xslt转换将数据加载到cdata节中?
我正在使用Saxon 9.3处理我的数据,使用命令行变换命令。
以及有关XSLT和你的问题你的问题标题会谈被标记为XSLT中,XSLT方式,以确保结果元素的内容被序列化为CDATA节是使用cdata-section-elements
属性xsl:output
元素(http://www.w3.org/TR/xslt20/#serialization)上市的所有上您想要输出为CDATA节的元素。因此,如果您在编写样式表时知道要作为CDATA节输出的元素,那么将它们列在该属性中很简单。 这有帮助吗?或者您是否想用XSLT后处理任意XML以添加CDATA节?
是的,正是我所需要的 – 2012-02-27 15:16:59
下面是一个完整的例子:
<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>
说明:
使用身份规则输出每个节点不变。
使用的xsl:output
的cdata-section-elements
属性来指定元素,其文本节点的孩子必须被序列化为CDATA段的空格分隔列表。
请注意:在你的情况下,将不便于修改现有变换所有,但对他们的结果后处理步骤类似于此的例子。
完美满足我的需求,很好地解释,但只有一个赢家! – 2012-02-27 16:06:34
@TheArtfulBenny:这是共享的知识 - *所有*都是获胜者。 – 2012-02-27 16:14:20
您是否需要区分“文本”元素和其他元素,还是将“”转换为“<![CDATA [42]]>”是否有效? – Filburt 2012-02-27 13:18:34
@Filburt不,不需要区分 - 它们需要所有数据(不论类型)在CDATA中。所以是的,'<![CDATA [42]]>'就是他们想要的。 – 2012-02-27 13:23:47