使元素始终只包含CDATA(在XML文档中嵌入XML示例)

时间:2012-04-21 02:06:48

标签: xml xslt dtd cdata xml-dtd

我正在为我的大学计算俱乐部准备一份关于XML和XSLT的演讲,我不是专家,但我比其他任何人都好,而且它只是一个小时的入门。 所以对于我的幻灯片,我想我会使用XML文档。 然后,我将变成一系列使用XSLT 2.0的网页

所以我们有源文件

<slideshow>
  <slide title="Example">
    <para>Below is an example of an XML document</para>
    <code> <![CDATA[
<?xml version="1.0"?>
<elephant Name="Fido">
  <head>
    <eyes qty="2" colour="blue"/>
    <trunk/>
    <ears qty="2"/>
  </head>
  <body>
    Thin, ribs showning
  </body>
  <legs qty="4">
    Roughly 1.5m Long
  </legs>
</elephant> ]]>
    </code>
  </slide>
</slideshow>

因为我不希望我的示例构成文档的XML结构的一部分,(并且不希望它们被XSLT更改) 我有CDATA部分。 所以,每当我有一个<code>...</code>元素时,它总是被写成: <code><![CDATA[...]]></code> 这是重复的信息。

我是否可以声明每个code元素只包含(未分析)字符数据?

所以我只想写<code>...</code>,它永远不会试图解析里面的内容。

似乎可以使用DTD完成某些事情?


我正在寻找的答案是

使用 <!DECLARE-CDATA-ELEMENT code>会生成代码元素,而不会解析其内容。


您可以使用权限来理解它:

<!ENTITY CodeStart "<code><![CDATA["> 
<!ENTITY CodeEnd "]]></code>">

然后使用:&CodeStart;<don'tParse/>&CodeEmd;


不,它无法完成,但您可以强制所有代码部分都不包含子元素...


不,但你可以像这样进行预处理:......


这些不是答案,只是表明答案可能是什么样的 (希望现在更清楚了)

4 个答案:

答案 0 :(得分:2)

  

因为我不希望我的例子构成XML结构的一部分   我有这个文件(并且不希望它们被XSLT更改)   CDATA部分。

没有必要使用CDATA部分来保护某些XML片段不被“XSLT更改” - 只需编写XSLT代码,使其复制以{为根“的任何子树。 {1}}元素

  

是否可以声明每个代码元素只包含   (未分析)字符数据?

是的,但是XSLT不要求源XML文档或处理结果都有DTD (架构感知XSLT 2.0可以验证这些甚至是中间结果,但它只适用于XML Schema(XSD)),如果有这样的DTD,XSLT不使用任何类型信息(唯一的例外是存在ID属性)。因此,提供这样的DTD不会有所帮助。

此外,违反此类DTD,除非您至少逃脱code子文本节点中的每个&<字符

来自W3C XML specification

  

“[定义:所有非标记的文本构成文档的字符数据。]&符号(&amp;)和左角   括号(&lt;)不得以其字面形式出现,除非用作   标记分隔符,或注释,处理指令或a   CDATA部分。如果他们需要在其他地方,他们必须逃脱   使用数字字符引用或字符串“&amp;”和   “&lt;”分别。“

答案 1 :(得分:1)

首先,我知道没有机制可以做到这一点。

第二,由于我对xml标准的理解有限,我认为你想要的不存在。 xml规范有一个“格式良好”的概念,适用于没有(或“之前”,如果你喜欢)DTD的xml文档,而没有CDATA的文档也不会格式正确。

换句话说,xml文档必须自己遵循某些规则;您要求的是DTD会放宽/更改这些规则,但除了格式良好(导致“有效”文档)之外,DTD仅提供进一步检查,它们无法改变格式良好的要求。 / p>

但我不是伟大的xml专家......

ps问题是看<?xml... ?>部分;正如另一个答案所说,你可以直接在文档中嵌入xml元素(在这种情况下,如果你想让“包含”和“嵌入式”xml之间的区别更明确地看看xml名称空间)。

答案 2 :(得分:1)

我看到了关于code和CDATA部分之间关系的观点:如果你没有一个没有另一个,那么其中一个没有携带太多信息。但不,其他答案都是正确的:没有办法声明应该以不同的方式解析code元素。

对于它的价值,SGML DTD确实能够使用CDATA关键字声明元素,其含义是“此元素中的所有内容都是字符数据,而不是标记,因此不要在此处识别分隔符”。当然,你确实想要识别元素的结尾,所以事情变得相当复杂,并且CDATA声明结果(即使在所有复杂情况之后)也没有为用例做好工作描述

因此,即使我们没有Andrew Cooke提到的动机,我们也可能在XML中使用深层次的CDATA元素声明:任何允许声明更改解析器行为的工具都会导致无法解析而无法读取DTD。

所以:您反对的冗余基本上是由于您正在处理两个不同的受众:CDATA标记的部分与解析器讨论要解析的内容和方式以及{{1} } element与下游应用程序(例如您的XSLT样式表)讨论文档的逻辑结构。小规模分层简单过程的一般原则的一个小例子有时会增加冗长度。

我希望你的演讲顺利。

答案 3 :(得分:0)

我倾向于不嵌入示例文档,而是引用它们:

<code ref="example1.xml"/>