为了弄明白这个问题,让我们把它放到具体的实例中去。假设你有一些数据,不是XML的,但是使用了XML的一些特征——如尖括号:
<ThisIsMyElement> <here is an example> </ThisIsMyElement>
我们有两种方法在XML中表示这个数据。第一中方法是使用尖括号的转义字符串,如下:
<ThisIsMyElement> <here is an example> </ThisIsMyElement>
这个方法对小片段会很有用;但是,你如果不愿意在很大的一系列数据中使用尖括号转义字符串,那么你可以用另外一种方法替代它:
<ThisIsMyElement> <![CDATA[ <here is an example> ]]> </ThisIsMyElement>
在这里,你使用了CDATA转义字符串来提示解析器:这里有一些不需要遵循XML的字符数据。这样就允许你把很多使用了尖括号(或者&)的数据放在一个地方,而不用去转义每个尖括号。但你在XSL中使用CDATA片段时,这样会出现什么问题呢?
我们的XSL例子从一个简单的XML文档开始,如清单1所示。这个文档只包含了两个元素。我们想通过使用XSL为它加上一个元素。
我们第一个尝试是为它加上如清单2所示的新数据:
清单2:nonxmldata1.xsl
这个方法的问题是:XSL引擎不能确定<…>标签中的单词发生了什么?它看起来像属性,但是属性是有值的,而它没有值。我们第二个方法如清单3所示:
清单3:nonxmldata2.xsl
这个清单中,我们已经在非XML数据周围加入了一个CDATA声明。遗憾的是,解析这些数据时碰到尖括号都要单独转义一次。虽然这并不构成主要问题,但在这里,我们是要解决让XML包含一个CDATA片段,而避免用转义字符串的问题。