【问题标题】:Delimiters in XML-namespaces - relative import of namespacesXML 命名空间中的分隔符 - 命名空间的相对导入
【发布时间】:2013-01-20 12:25:55
【问题描述】:

我有一个关于 XML 命名空间的概念性问题: 如果我在文件夹层次结构中有两个不同的 xsd 文件:

fileA.xsd
folder/
    fileB.xsd

在这两个文件中,我通过 targetNamespace 属性定义了一个单独的命名空间:

在 fileA.xsd 中

targetNamespace="http://www.anurlofmine.com/myproject/A"

在 fileB.xsd 中是:

targetNamespace="http://www.anurlofmine.com/myproject/folder/B"

我可以使用 url 中的路径进行相对导入吗?

我可以使用例如

<xs:schema xmlns:relativeA="../A">

在文件 B.xsd 中?

我并不真正关心实现它的方法,我知道有各种方法可以指定模式定义的位置,我只关心 url 中路径的含义。

据我所知,url 只是一个字符串,用于唯一标识 xsd 文件中的类型(除了指定一个 可能 看起来的位置 - 不能保证 - 用于定义文件)。我说的对吗?

希望我的问题不会太奇怪而无法回答:)

提前非常感谢 米沙

【问题讨论】:

    标签: namespaces xsd relative-import


    【解决方案1】:

    XSD 模式文档中 import 和 include 元素的 schemaLocation 属性中的模式位置提示被指定为 xs:anyURI 类型,这意味着是的,它可以是相对引用。

    所以在你的 fileB.xsd 中,你可以有一个格式为 import 的声明

    <xs:import namespace="http://www.anurlofmine.com/myproject/A"
               schemaLocation="../fileA.xsd"/>
    

    另一方面,命名空间声明的值(例如您的示例中的 xmlns:relativeA)应该是绝对 URI,而不是相对 URI。许多程序实际上并不检查命名空间名称作为 URI 的合法性,因此使用“../A”作为命名空间名称不一定会引发错误。但是定义 XML 技术堆栈的基本 W3C 规范指定使用相对 URI 作为命名空间名称的文档的信息集是未定义的。

    在任何情况下,将命名空间声明添加到 xs:schema 元素不会产生导入该命名空间或引用可能位于指定位置的任何架构文档的效果。

    【讨论】:

    • 感谢您的回答,很准确!在当前项目中,我们不使用 schemaLocation 属性。而是使用 catalog.xml 文件,并且所有模式定义都本地保存在用户计算机上。因此使用 schemaDefinition attr 进行相对导入。是不可能的。
    猜你喜欢
    • 2013-07-18
    • 1970-01-01
    • 1970-01-01
    • 2021-10-03
    • 2021-02-26
    • 1970-01-01
    • 2010-12-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多