我打算收到这个结构:
<?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>
答案 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中可用。