XSD 1.1 替代测试text()的内容
XSD 1.1 alternative test the contents of text()
这是我想做的事情:
<xs:element name="width">
<!-- If the value is auto, then it can have min/max attribs -->
<xs:alternative test="text() eq auto" type="heightWidthAutoType" />
<!-- Otherwise it is treated as a normal positionType -->
<xs:alternative type="positionType" />
</xs:element>
这应该适用于第一个备选方案(但不适用):
<width min='100' max='100'>auto</width>
这个为默认:
<width>100</width>
无论我为标签的内容输入什么,它总是选择默认值。我假设 text() 在替代方案中无效,但我似乎找不到这样说的文档。
所以我回去实际阅读了详细信息(而不是略读)...
1 An instance of the [XDM] data model is constructed as follows:
1.1 An information set is constructed by copying the base information set
properties (and not any of the properties specific to ·post-schema-
validation infoset·) of the following information items:
1.1.1 E itself.
1.1.2 E's [attributes] (but not its [children]).
看来它不允许您针对其文本节点(或任何其他子节点)进行测试。
解决方案
以下是我最终解决问题的方法:
<xs:element name="width" type="heightWidthType" />
<xs:element name="height" type="heightWidthType" />
<xs:complexType name="heightWidthType">
<xs:simpleContent>
<xs:extension base="positionType">
<!-- These are actually only valid if the value of the element is auto -->
<xs:attribute name="min" type="xs:unsignedInt" />
<xs:attribute name="max" type="xs:unsignedInt" />
<xs:assert test="not((@min or @max)) or ((@min or @max) and $value eq 'auto')" />
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<xs:simpleType name="positionType">
<xs:restriction base="xs:string">
<!-- If an "r" is included (eg 180r) then the measurement is taken from the parent's right edge (in the left direction). -->
<xs:pattern value="-?\d+(\.\d+)?(r|%)?" />
<xs:pattern value="auto" />
</xs:restriction>
</xs:simpleType>
这是我想做的事情:
<xs:element name="width">
<!-- If the value is auto, then it can have min/max attribs -->
<xs:alternative test="text() eq auto" type="heightWidthAutoType" />
<!-- Otherwise it is treated as a normal positionType -->
<xs:alternative type="positionType" />
</xs:element>
这应该适用于第一个备选方案(但不适用):
<width min='100' max='100'>auto</width>
这个为默认:
<width>100</width>
无论我为标签的内容输入什么,它总是选择默认值。我假设 text() 在替代方案中无效,但我似乎找不到这样说的文档。
所以我回去实际阅读了详细信息(而不是略读)...
1 An instance of the [XDM] data model is constructed as follows:
1.1 An information set is constructed by copying the base information set
properties (and not any of the properties specific to ·post-schema-
validation infoset·) of the following information items:
1.1.1 E itself.
1.1.2 E's [attributes] (but not its [children]).
看来它不允许您针对其文本节点(或任何其他子节点)进行测试。
解决方案
以下是我最终解决问题的方法:
<xs:element name="width" type="heightWidthType" />
<xs:element name="height" type="heightWidthType" />
<xs:complexType name="heightWidthType">
<xs:simpleContent>
<xs:extension base="positionType">
<!-- These are actually only valid if the value of the element is auto -->
<xs:attribute name="min" type="xs:unsignedInt" />
<xs:attribute name="max" type="xs:unsignedInt" />
<xs:assert test="not((@min or @max)) or ((@min or @max) and $value eq 'auto')" />
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<xs:simpleType name="positionType">
<xs:restriction base="xs:string">
<!-- If an "r" is included (eg 180r) then the measurement is taken from the parent's right edge (in the left direction). -->
<xs:pattern value="-?\d+(\.\d+)?(r|%)?" />
<xs:pattern value="auto" />
</xs:restriction>
</xs:simpleType>