如果我有以下XML:
<properties>
<parameter key="number">1</parameter>
<parameter key="letter">A</parameter>
</properties>
...and我希望“属性”的支持XSD强制所有"key“属性为"number”的“参数”标记只接受文本内容的数字,而所有带有"letter“的标记只接受字母,是否可以使用XSD来表示该约束方案?如果不是,是否可以在任何其他模式语言下执行此操作?
请注意,我当然完全知道我可以这样做:
<properties>
<number>1</number>
<letter>A</letter>
</properties>
...but此练习的目标是压缩比上面直接表示的更复杂的场景。
简而言之,我正在寻找一种构建基于XML的“非冗长”属性文件的方法,该文件能够处理潜在的复杂值约束,甚至包括与上面示例中的"attr“或"key”处于同一级别的属性的可能约束。
发布于 2014-01-08 11:07:35
对于您的问题,这将是一个非常直观的XSD1.1。它是基于type alternatives的。
<?xml version="1.0" encoding="utf-8" ?>
<!-- XML Schema generated by QTAssistant/XSD Module (http://www.paschidev.com) -->
<xsd:schema elementFormDefault="qualified" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xerces="http://xerces.apache.org">
<xsd:element name="properties">
<xsd:complexType>
<xsd:sequence>
<xsd:element ref="parameter" maxOccurs="unbounded" />
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="parameter">
<xsd:alternative test="@key eq 'number'" type="number"/>
<xsd:alternative test="@key eq 'letter'" type="letter"/>
</xsd:element>
<xsd:complexType name="number">
<xsd:simpleContent>
<xsd:extension base="xsd:int">
<xsd:attribute name="key" type="xsd:string" use="required" fixed="number"/>
</xsd:extension>
</xsd:simpleContent>
</xsd:complexType>
<xsd:complexType name="letter">
<xsd:simpleContent>
<xsd:extension base="aletter">
<xsd:attribute name="key" type="xsd:string" use="required" fixed="letter"/>
</xsd:extension>
</xsd:simpleContent>
</xsd:complexType>
<xsd:simpleType name="aletter">
<xsd:restriction base="xsd:string">
<xsd:pattern value="[A-Z]"/>
</xsd:restriction>
</xsd:simpleType>
</xsd:schema>
无效的XML,例如:
<properties>
<parameter key="number">A</parameter>
<parameter key="letter">1</parameter>
</properties>
将产生以下输出(我使用自己的工具QTAssistant,它使用XSD1.1的Xerces )。
加载[]时出现
错误,第2行位置42 cvc-datatype-valid.1.2.1:'A‘不是'integer’的有效值。
加载[]时出错,第2行位置42 cvc-complex-type.2.2:元素“”参数“”必须没有元素子项,并且值必须有效。“”
加载[]时出错,第3行位置42 cvc- pattern -valid:值'1‘相对于类型'aletter’的模式'A-Z‘无效。
加载[]时出错,第3行位置42 cvc-complex-type.2.2:元素'parameter‘不能有元素子项,并且值必须有效。
https://stackoverflow.com/questions/20913238
复制相似问题