是否有可能xsd-validate是一个具有精确属性的元素?

时间:2016-12-16 08:42:12

标签: xml xsd jaxb key-value xml-attribute

我打算收到这个结构:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Document>
    <property key="DocumentType"   value="INV" />
    <property key="InvInternalNumber" value="i-1651-84" />
    <property key="OtherDynamicProperty" value="yes" />
</Document>

我识别文档类型并使用“INV.xsd”进行验证

哦,生意说Invoice必须有“InvInternalNumber”属性!

所以, 是否有可能xsd验证“有没有属性”InvInternalNumber“”?

更新 该XSD由JaxbContext生成。

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

  <xs:element name="Document" type="Document"/>

  <xs:complexType name="Document">
    <xs:sequence>
      <xs:element name="property" type="property" nillable="true" minOccurs="0" maxOccurs="unbounded"/>
    </xs:sequence>
  </xs:complexType>

  <xs:complexType name="property">
    <xs:sequence/>
    <xs:attribute name="key" type="xs:string"/>
    <xs:attribute name="value" type="xs:string"/>
  </xs:complexType>
</xs:schema>

2 个答案:

答案 0 :(得分:3)

XSD 1.0不是为此作业设计的:它假定元素名称决定了要应用的验证规则。解决它的一种方法是将XML(使用XSLT)转换为

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Document>
    <DocumentType>INV</DocumentType>
    <InvInternalNumber>i-1651-84</InvInternalNumber>
    <OtherDynamicProperty>yes</OtherDynamicProperty>
</Document>

然后验证。 (您可以通过使用模式感知转换并验证结果文档,在一个步骤中实现此目的。)

如果验证规则不是由元素名称确定,而是由属性值(在您的情况下为property/@key)确定,则可以使用XSD 1.1中的条件类型分配的新功能。这允许您声明property元素的类型(以及其value属性的类型)取决于key属性的值。

答案 1 :(得分:1)

似乎这在XSD 1.0中是不可能的,我想如果您假设 InvInternalNumber 始终是您可以使用 fixed 属性的第一个元素像这样做,但不幸的是这是无效的。

  

错误cos-element-consistent:类型&#39;文档&#39;出错。具有不同类型的名称&#39;属性&#39;的多个元素出现在模型组中。

因为@Dag说我认为唯一的解决方案在link provided的XSD 1.1中可用。

enter image description here