【问题标题】:Can I create an XSD schema that places an attribute on a specific complex type?我可以创建一个 XSD 架构,将属性放在特定的复杂类型上吗?
【发布时间】:2015-11-14 01:36:04
【问题描述】:

我给了

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema
  targetNamespace="AdditionalAttribute.OtherXSD"
  xmlns:o="AdditionalAttribute.OtherXSD" 
  xmlns:xs="http://www.w3.org/2001/XMLSchema"
>
  <xs:element name="Tag" type="o:TagType" />
  <xs:complexType name="TagType" />
</xs:schema>

我想写

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema
  targetNamespace="AdditionalAttribute.MyXSD" 
  xmlns:xs="http://www.w3.org/2001/XMLSchema"
>
  <!-- ? -->
</xs:schema>

所以这变成了有效的 XML:

<?xml version="1.0" encoding="UTF-8"?>
<o:Tag
  xmlns:o="AdditionalAttribute.OtherXSD"
  xmlns:m="AdditionalAttribute.MyXSD"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="
    AdditionalAttribute.OtherXSD AdditionalAttribute.OtherXSD.xsd 
    AdditionalAttribute.MyXSD AdditionalAttribute.MyXSD.xsd
  "
  m:AdditionalAttribute="Value"
/>

我知道另一个 XSD 中有一个 similar question, that asks how to place an additional attribute to all complex types。答案是否定的。但是,我不是这方面的专家,从那里的答案中我无法推断出特定复杂类型是否可能。我尝试了几件事但没有成功,似乎只有通过 xsd:extension'ing 或 xsd:restriction'ing 复杂类型才有可能,从而派生出一个新类型,这不是我想要的。我想在同一个标​​签上“合并”属性:

  <o:Tag o:...=...           />
+ <o:Tag           m:...=... />
= <o:Tag o:...=... m:...=... />

这可能吗?如何实现?

【问题讨论】:

    标签: xml xsd xml-validation


    【解决方案1】:
    <?xml version="1.0" encoding="utf-8"?>
    <xs:schema xmlns:o="AdditionalAttribute.OtherXSD" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:m="AdditionalAttribute.MyXSD" attributeFormDefault="unqualified" elementFormDefault="qualified" targetNamespace="AdditionalAttribute.OtherXSD" xmlns:xs="http://www.w3.org/2001/XMLSchema">
      <xs:import namespace="AdditionalAttribute.MyXSD" />
      <xs:element name="Tag">
        <xs:complexType>
          <xs:attribute ref="m:AdditionalAttribute" use="required" />
        </xs:complexType>
      </xs:element>
    </xs:schema>
    

    【讨论】:

    • 我认为这不是我想要的。我在这里交换了命名空间“MyXSD”和“OtherXSD”,因为我可以编辑 MyXSD 并且可以导入 OtherXSD。我想向其他地方定义的标签添加一个额外的(新的)属性。有了这个,XMLLint 给了我:AdditionalAttribute.MyXSD.xsd:11: element attribute: Schemas parser error : attribute use (unknown), attribute 'ref': The QName value '{AdditionalAttribute.OtherXSD}AdditionalAttribute' does not resolve to a(n) attribute declaration. WXS schema AdditionalAttribute.MyXSD.xsd failed to compile
    【解决方案2】:

    我认为您的问题是您试图在 XML Schema 中一些故意施加的约束之外进行操作。

    • 标签由限定名称 ( QName ) 标识,该名称由名称和命名空间组成。
    • 标签的类型定义了其允许的内容

    您的提议是向“标签”添加一个新属性,从而为 XSD 模型的一些消费者更改其类型。

    话虽如此,只要您愿意将 xsi:type 属性添加到 XML,您就可以做您想做的事。鉴于 o:TagType 是一个空类型,你不妨这样做:

    <m:Tag xsi:type="m:TagWithAttribute" m:additionalAttribute="Value" />
    
    • 使 o:TagType 成为抽象类型
    • 使用 xs:extension 创建基于 o:TagType 的新类型 'm:TagWithAttribute'

    通过添加 xsi:type 属性,架构验证器可以将您对“标签”的使用与其他希望对其进行不同验证的人区分开来。换句话说,XML Schema 正在强制执行强类型(xs:redefines 绕过了强类型,这就是为什么有些人不喜欢它)。

    【讨论】:

      猜你喜欢
      • 2023-03-27
      • 2010-09-24
      • 2011-09-30
      • 1970-01-01
      • 2013-04-03
      • 2019-01-05
      • 1970-01-01
      • 1970-01-01
      • 2020-07-11
      相关资源
      最近更新 更多