Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xml 我可以创建一个XSD模式,将属性放置在特定的复杂类型上吗?_Xml_Xsd_Xml Validation - Fatal编程技术网

Xml 我可以创建一个XSD模式,将属性放置在特定的复杂类型上吗?

Xml 我可以创建一个XSD模式,将属性放置在特定的复杂类型上吗?,xml,xsd,xml-validation,Xml,Xsd,Xml Validation,我已经放弃了 <?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:TagTyp

我已经放弃了

<?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中发现了一个错误。答案是否定的。然而,我不是这方面的专家,从那里的答案来看,我无法得出是否有可能用于特定的复杂类型。我尝试了几件事都没有成功,似乎只有通过xsd:extension'ing或xsd:restriction'ing一个复杂类型,从而派生出一个新类型,这不是我想要的。我想“合并”同一标记上的属性:

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

+ 
= 
这可能吗?如何实现?


<?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>

我认为您的问题在于,您试图在XML模式中故意施加的一些约束之外进行操作

  • 标记由限定名(QName)标识,限定名由名称和命名空间组成
  • 标记的类型定义了其允许的内容
您的建议是向“Tag”添加一个新属性,从而更改XSD模型的某些使用者的类型

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

<m:Tag xsi:type="m:TagWithAttribute" m:additionalAttribute="Value" />

  • 使o:TagType成为抽象类型
  • 使用xs:extension基于o:TagType创建新类型“m:TagWithAttribute”

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

我认为这不是我想要的。我在这里交换了名称空间“MyXSD”和“OtherXSD”,因为我可以编辑并导入OtherXSD的是MyXSD。我想向别处定义的标记添加一个附加(新)属性。在这里XMLLint给了我:
AdditionalAttribute.MyXSD.xsd:11:元素属性:模式解析器错误:属性使用(未知),属性“ref”:QName值“{AdditionalAttribute.OtherXSD}AdditionalAttribute”没有解析为(n)属性声明。WXS架构AdditionalAttribute.MyXSD.xsd未能编译