在类型属性中使用自定义 xml 命名空间前缀

Use a custom xml namespace prefix in type attribute

我想从 xsd:string 引入新的命名空间和前缀 "extending" hod:string。然后在我的模式中我可以定义一个字符串元素:

<xsd:element name="Label" type="hod:string"/>

这样我就可以将 hod:string 类型的所有元素的 maxLength 更改为 80。如果该要求稍后更改为 50,我可以简单地更改 hod:string 中的定义一个地方。这就是我正在尝试的——我的 IDE 不喜欢第 15 行 ("cannot resolve symbol hod:string"):

<xs:schema xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:xsd="http://www.w3.org/2001/XMLSchema"
       xmlns:xs="http://www.w3.org/2001/XMLSchema"
       xmlns:hod="http://hod.com/2019/XMLSchema/hod"
       attributeFormDefault="unqualified" elementFormDefault="qualified">

  <xsd:simpleType name="hod:string">
    <xsd:restriction base="xsd:string">
      <xsd:maxLength value="80"/>
    </xsd:restriction>
  </xsd:simpleType>

  <xsd:complexType name="Object">
    <xsd:sequence>
      <xsd:element name="Label" type="hod:string"/>
      <xsd:element name="MateriaID" type="GUID"/>
  ...

我将所有“hod:string”更改为“mystring”以验证我定义的内容是否正确并且看起来很高兴,但我想要使用如果可能,前缀。 (也试图改变这个:attributeFormDefault="qualified" 但它似乎没有什么不同)

简单类型从 xs:schema 元素的 targetNamespace 属性获取它们的命名空间。由于您的 xs:schema 元素没有 targetNamespace,您当前的 elements/types,包括您的自定义字符串类型,没有命名空间。

如果您想将当前元素保留在无命名空间中,而只让您的字符串类型有命名空间,您需要在具有不同 targetNamepsace 的新架构中定义类型,并将其导入到此模式。例如:

hodtypes.xsd

<xsd:schema
       xmlns:xsd="http://www.w3.org/2001/XMLSchema"
       xmlns:hod="http://hod.com/2019/XMLSchema/hod"
       targetNamespace="http://hod.com/2019/XMLSchema/hod">

  <xsd:simpleType name="string">
    <xsd:restriction base="xsd:string">
      <xsd:maxLength value="80"/>
    </xsd:restriction>
  </xsd:simpleType>

</xsd:schema>

main.xsd

<xs:schema xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:xsd="http://www.w3.org/2001/XMLSchema"
       xmlns:xs="http://www.w3.org/2001/XMLSchema"
       xmlns:hod="http://hod.com/2019/XMLSchema/hod"
       attributeFormDefault="unqualified" elementFormDefault="qualified">

  <xsd:import namespace="http://hod.com/2019/XMLSchema/hod" schemaLocation="hodtypes.xsd" />

  <xsd:complexType name="Object">
    <xsd:sequence>
      <xsd:element name="Label" type="hod:string"/>
      <xsd:element name="MateriaID" type="GUID"/>
      ...