一个在XSL模板中使用字符数据的更好的方法

ZDNet软件频道 时间:2003-04-10 作者:翻译:Java研究组织-barney |  我要评论()
本文关键词:
在处理XML文档时,你偶然会发现一些XML无法解释的的数据。为了解决这类问题,我们通常的作法是把这些数据定义为字符数据,即CDATA。遗憾的是……
本文译自Builder.com在处理XML文档时,你偶然会发现一些XML无法解释的的数据。为了解决这类问题,我们通常的作法是把这些数据定义为字符数据,即CDATA。它们会提示XML解析器保留这些数据的原始信息。遗憾的是,当你使用XSL的时候,它们并不总是如你所愿地发挥作用。

XML中的字符数据

为了弄明白这个问题,让我们把它放到具体的实例中去。假设你有一些数据,不是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的例子

我们的XSL例子从一个简单的XML文档开始,如清单1所示。这个文档只包含了两个元素。我们想通过使用XSL为它加上一个元素。

我们第一个尝试是为它加上如清单2所示的新数据:

清单2:nonxmldata1.xsl

这个方法的问题是:XSL引擎不能确定<…>标签中的单词发生了什么?它看起来像属性,但是属性是有值的,而它没有值。我们第二个方法如清单3所示:

清单3:nonxmldata2.xsl

这个清单中,我们已经在非XML数据周围加入了一个CDATA声明。遗憾的是,解析这些数据时碰到尖括号都要单独转义一次。虽然这并不构成主要问题,但在这里,我们是要解决让XML包含一个CDATA片段,而避免用转义字符串的问题。


百度大联盟认证黄金会员Copyright© 1997- CNET Networks 版权所有。 ZDNet 是CNET Networks公司注册服务商标。
中华人民共和国电信与信息服务业务经营许可证编号:京ICP证010391号 京ICP备09041801号-159
京公网安备:1101082134