如何强制xslt转换将数据加载到cdata部分?

时间:2012-02-27 13:09:49

标签: xslt saxon

我有一个客户端要求我提供的xml中的所有文本都在CDATA部分。我知道文本不应该在CDATA中,因为它已经被提供给客户端时已被解析和转换。但是,无论我多么确定,他们仍然需要CDATA部分。叹息。

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

2 个答案:

答案 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>

<强>解释

  1. 使用标识规则按原样输出每个节点。

  2. 使用cdata-section-elements的{​​{1}}属性指定以空格分隔的元素列表,其文本节点子元素必须序列化为CDATA节。

  3. 请注意:在您的情况下,根本不会修改现有的转换,而是对其结果进行后处理,这与此示例类似。