【问题标题】:Can a XML schema have mix and match of qualified and unqualified namespaces?XML 模式可以混合和匹配合格和不合格的命名空间吗?
【发布时间】:2015-02-04 10:27:22
【问题描述】:

据我从 W3school 得知,如果在 XML 模式上将属性“elementFormDefault”设置为 unqualified,则 XML 元素将没有前缀。如果我的架构设置了不合格的元素表单并且正在导入另一个架构,这会是一个问题吗?

示例:我有 Schema A 导入 Schema B 的内容。然后在最不幸的情况下,模式 A 有一个名为“ItemName”的元素,其中模式 B 也有一个。而且由于我们不能在这里使用前缀,所以没有简单的方法来区分这两个元素。

这是一个有效的场景吗?

如果是,我如何区分它们?

如果是,这是否意味着架构可以混合和匹配 elementFormDefault=qualified 和 unqualified 命名空间,并且其中没有潜在的元素名称冲突?

感谢您的帮助!

【问题讨论】:

    标签: xml namespaces


    【解决方案1】:

    对我来说,这不是一个有效的方案,XSD 定义绝不能冲突,否则会使您的 XSD 集无效。如果 2 个实体具有相同的名称并且必须在公共架构中使用/导入,则它们必须通过命名空间(elementFormDefault 限定、targetnamespace - 和默认命名空间 - 存在)来区分。

    如果您使用的是良好的 XML 模式验证器,它应该会引发错误,或者至少是一个警告。如果它“不是无效的”,这是非常危险的,因为解析器或验证器会随机选择一个定义。

    如果我能在 w3.org 中找到几行断言这一点,我会进行更新:-)

    【讨论】:

    • 感谢您的回答。这是非常有帮助的。我只是在浏览 XML 标准。似乎元素可以使用 xmlns 属性覆盖其默认声明的命名空间。这是区分两个项目名称的好方法吗?例如 *注意这是一个对 xml 元素使用不合格的架构。
    • 我从未在 XSD 中尝试过,但是当您在 XML 实例中执行此操作时它可以工作。由于 XSD 本身就是 XML,它可能没问题 :-D 我猜在这种情况下,解析定义的引擎会记住具有不同 QName 的 ItemName(blah:ItemName 和 notTheSameblah:ItemName),但不确定你可以去做吧。
    • 对原帖发表评论:你import一个模式,如果它定义了一个targetNamespace,所以一般来说因为元素或属性是合格的(否则没用),如果你没有命名空间,你将include 而不是import,这就像在包含器中复制粘贴包含xsd。
    【解决方案2】:

    首先直接回答您的问题:elementFormDefault 就是它所说的,它只是元素声明中“form”属性的默认值,如果您愿意,您可以将各个声明的 form 属性设置为不同的值.

    但我从未见过有人这样做,这可能是有充分理由的。

    但是现在,更仔细地阅读您的问题,其中有几个错误的假设。

    首先,elementFormDefault 适用于单个架构文档,而不是整个架构。特别是,它不会影响导入的模式文档。

    其次,你说如果你使用elementFormDefault=unqualified,那么元素就不会有前缀。这不太准确。这意味着在复杂类型中本地声明的元素将没有任何命名空间 URI。重要的是命名空间,而不是前缀。

    第三, elementFormDefault=unqualified 的全部意义(顺便说一句,它很少使用)是说您不需要将元素放在命名空间中,因为它们可以通过上下文消除歧义。是的,这允许您拥有两个具有相同名称和不同内容模型的不同元素。如果你认为这是一个坏主意,那就不要这样做。但是根据一个有 BOOK 作为父级,另一个有 PERSON 的事实来区分两个 TITLE 元素是非常可行的;有些人会说这通常比将它们放在不同的命名空间中更简单。

    【讨论】:

      猜你喜欢
      • 2011-11-26
      • 1970-01-01
      • 1970-01-01
      • 2012-03-13
      • 1970-01-01
      • 2012-05-02
      • 1970-01-01
      • 2015-03-29
      • 1970-01-01
      相关资源
      最近更新 更多