我正在为我的大学计算俱乐部准备一份关于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;
不,它无法完成,但您可以强制所有代码部分都不包含子元素...
不,但你可以像这样进行预处理:......
这些不是答案,只是表明答案可能是什么样的 (希望现在更清楚了)
答案 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
子文本节点中的每个&
和<
字符:
“[定义:所有非标记的文本构成文档的字符数据。]&符号(&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"/>