2012-02-27 52 views
3

我有一个客户端需要我提供的所有文本都在CDATA部分。我知道文本不需要在CDATA中,因为它在提供给客户端时已经被解析和转换。但是,不管我有多确定,他们仍然需要CDATA部分。叹。如何强制xslt转换将数据加载到cdata节中?

我正在使用Saxon 9.3处理我的数据,使用命令行变换命令。

+0

您是否需要区分“文本”元素和其他元素,还是将“”转换为“<![CDATA [42]]>”是否有效? – Filburt 2012-02-27 13:18:34

+0

@Filburt不,不需要区分 - 它们需要所有数据(不论类型)在CDATA中。所以是的,'<![CDATA [42]]>'就是他们想要的。 – 2012-02-27 13:23:47

回答

4

以及有关XSLT和你的问题你的问题标题会谈被标记为XSLT中,XSLT方式,以确保结果元素的内容被序列化为CDATA节是使用cdata-section-elements属性xsl:output元素(http://www.w3.org/TR/xslt20/#serialization)上市的所有上您想要输出为CDATA节的元素。因此,如果您在编写样式表时知道要作为CDATA节输出的元素,那么将它们列在该属性中很简单。 这有帮助吗?或者您是否想用XSLT后处理任意XML以添加CDATA节?

+0

是的,正是我所需要的 – 2012-02-27 15:16:59

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> 

说明

  1. 使用身份规则输出每个节点不变。

  2. 使用的xsl:outputcdata-section-elements属性来指定元素,其文本节点的孩子必须被序列化为CDATA段的空格分隔列表。

请注意:在你的情况下,将不便于修改现有变换所有,但对他们的结果后处理步骤类似于此的例子。

+0

完美满足我的需求,很好地解释,但只有一个赢家! – 2012-02-27 16:06:34

+0

@TheArtfulBenny:这是共享的知识 - *所有*都是获胜者。 – 2012-02-27 16:14:20