2

我正在为我的大学计算俱乐部准备一篇关于 XML 和 XSLT 的 Presentation,我不是专家,但我比任何人都好,而且它只是一个 1 小时的入门。所以对于我的幻灯片,我想我会使用 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>which 将生成代码元素,而不是对其内容进行解析。


你可以用实体来模拟它:

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

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


不,不能这样做,但您可以强制所有代码段不包含子元素...


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


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

4

4 回答 4

2

因为我不希望我的示例构成文档的 XML 结构的一部分(并且不希望它们被 XSLT 更改),所以我有 CDATA 部分。

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

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

是的,但是 XSLT 不要求源 XML 文档或处理结果有 DTD(Schema-aware XSLT 2.0 可以验证这些甚至是中间结果,但它仅适用于 XML Schema (XSD) ),并且在存在这样的 DTD 的情况下,XSLT 不使用任何类型信息(唯一的例外是存在 ID 属性这一事实)。因此,提供这样的 DTD 不会有帮助。

此外,这样的 DTD 将被违反,除非您至少转义&<的子文本节点中的每个字符code

来自W3C XML 规范

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

于 2012-04-21T03:40:41.533 回答
2

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

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

CDATA因此,即使我们没有 Andrew Cooke 提到的动机, 我们也可能在 XML 中拥有深度六元素声明:任何允许声明改变解析器行为的工具都使得在不阅读 DTD 的情况下无法解析。

所以:您反对的冗余本质上是您针对两个不同受众这一事实的结果:CDATA标记部分与解析器讨论要解析的内容和方式,code元素与下游应用程序(例如您的 XSLT 样式表)对话关于文档的逻辑结构。简单过程的仔细分层有时会增加冗长的一般原则的一个小例子。

我希望你的演讲顺利。

于 2012-08-22T01:00:14.393 回答
1

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

其次,根据我对 xml 标准的有限理解,我认为您想要的东西不存在。xml 规范有一个“格式良好”的概念,适用于没有(或“之前”,如果您喜欢)DTD 的 xml 文档,并且没有 CDATA 的文档格式不正确。

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

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

ps问题出在<?xml... ?>零件上;正如另一个答案所说,您可以将 xml 元素直接嵌入到您的文档中(在这种情况下,如果您想在“包含”和“嵌入”xml 之间做出更明确的区别,请查看 xml 命名空间)。

于 2012-04-21T03:34:10.793 回答
1

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

<code ref="example1.xml"/>
于 2012-04-21T16:50:55.477 回答