我有一个带有两个命名空间的 XHTML 文档。 这是因为此 XHTML 文档包含 SVG 标签,如果 XHTML 文档中不包含 SVG 命名空间,则 SVG 将不会显示在网页上。
我创建了一个 XML 架构来验证此 XHTML 文档。 但是当我运行 XQuery 时,我收到了几个错误,这些错误主要集中在命名空间 SVG 元素上。
我在这个网站以及 OReilly 媒体出版的 XML Schema 书中研究了这个主题。 我还通读了 Wrox 出版的 Beginning XML 一书。
到目前为止,已建议使用标签 XS:Any 以及 XS:annotation 和 XS:documentation 元素来解决这些问题。 但由于我以前从未遇到过这个问题,也从未使用过这些说明,所以我不知道解决这些问题的最佳方法是什么。 这是我的 XHTML 代码:
<html xmlns="http://www.TedTheSpeedlearner.com" xmlns:svg="http://www.w3.org/2000/svg" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.TedTheSpeedlearner.com SVG_Bezier_Curve_Webpage_XML_Schema.xsd">
<head>
<title>SVG_Bezier_Curve</title>
<link rel="stylesheet" type="text/css" href="http://localhost:8080/exist/rest/db/apps/HTML_Student/SVG_Bezier_Curve.css"/>
<script language="javascript" src="http://localhost:8080/exist/rest/db/apps/HTML_Student/SVG_Bezier_Curve_2.js">
</script>
</head>
<body onload="Setup()">
<input type="button" id="Bezier_Curve_Button" value="Click Me!" onclick="Setup2()"/>
<svg:svg id="My_SVG" height="500" width="500">
<svg:path id="Bezier_Curve_1"/>
<svg:path id="Bezier_Curve_2"/>
</svg:svg>
</body>
这是我的 XML 架构:
<schema xmlns="http://www.w3.org/2001/XMLSchema" xmlns:target="http://www.TedTheSpeedlearner.com" targetNamespace="http://www.TedTheSpeedlearner.com" elementFormDefault="qualified">
<complexType name="HeadType">
<sequence>
<element name="head" type="target:TitleType"/>
<element name="body" type="target:BodyType"/>
</sequence>
</complexType>
<complexType name="TitleType">
<sequence>
<element name="title" type="string"/>
<element name="link" type="target:LinkType"/>
<element name="script" type="target:ScriptType"/>
</sequence>
</complexType>
<complexType name="LinkType">
<attribute name="rel" type="string"/>
<attribute name="type" type="string"/>
<attribute name="href" type="string"/>
</complexType>
<complexType name="ScriptType">
<attribute name="language" type="string"/>
<attribute name="src" type="string"/>
</complexType>
<complexType name="BodyType">
<sequence>
<element name="input" type="target:InputType"/>
<element name="svg" type="target:SvgType"/>
</sequence>
<attribute name="onload" type="string"/>
</complexType>
<complexType name="SvgType">
<sequence>
<element name="path" type="PathType"/>
<element name="path" type="Path2Type"/>
</sequence>
<attribute name="id" type="string"/>
<attribute name="height" type="string"/>
<attribute name="width" type="string"/>
</complexType>
<complexType name="InputType">
<attribute name="type" type="string"/>
<attribute name="id" type="string"/>
<attribute name="value" type="string"/>
<attribute name="onclick" type="string"/>
</complexType>
<complexType name="PathType">
<attribute name="id" type="string"/>
</complexType>
<complexType name="Path2Type">
<attribute name="id" type="string"/>
</complexType>
<element name="html" type="target:HeadType"/>
以下是生成的错误:
你有什么建议?
令我感到非常惊讶的是,您应该为 XHTML 和 SVG 编写自己的模式,而不是为这些命名空间使用已发布的模式。但后来我发现这不是 XHTML,它是一些非常相似的词汇,但使用了您自己发明的命名空间。
它认为 PathType 位于 xs 命名空间中的原因是你已经编写了
<element name="path" type="PathType"/>
PathType
上没有前缀,架构的默认命名空间是 xs
命名空间。您需要像处理其他组件引用一样编写 target:PathType
。
然后你就会遇到问题
<element name="svg" type="target:SvgType"/>
因为这在您的个人命名空间中声明了一个
svg
元素,而它实际上位于 W3C SVG 命名空间中。