说我有以下复杂类型
<xs:complexType name="matrix">
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute name="rows" type="xs:integer" use="required" />
<xs:attribute name="cols" type="xs:integer" use="required" />
</xs:extension>
</xs:simpleContent>
</xs:complexType>
这代表一个矩阵,其中的想法是我可以填写这样的东西(例如2x2矩阵):
<matrix rows=2 cols=2>1,2,3,4</matrix>
现在说我想基于这种类型创建一个元素,比如
<xs:element name="eulerangles" type="matrix">
在这种情况下,我仍然需要显式设置rows和cols属性,但是这个元素总是有3行3列。有可能以某种方式将属性设置为模式中的特定数字,这样我就不需要明确指定我想要3行和3列
即。而不是写这个:
<eulerangles rows=3 cols=3>1,2,3,4,5,6,7,8,9</eulerangles>
我希望能够像这样写作
<eulerangles>1,2,3,4,5,6,7,8,9</eulerangles>
虽然仍然有eulerangles是“矩阵”类型,有3行和3列
注意:我是XML和XSD的新手。我真的很感激任何有助于改善我的风格的评论。
答案 0 :(得分:1)
您在XSD 1.0中可能得到的最接近的模型是:
<?xml version="1.0" encoding="utf-8" ?>
<!-- XML Schema generated by QTAssistant/XSD Module (http://www.paschidev.com) -->
<xs:schema targetNamespace="http://tempuri.org/XMLSchema.xsd" xmlns="http://tempuri.org/XMLSchema.xsd" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:complexType name="matrixbase">
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute name="rows" type="xs:integer"/>
<xs:attribute name="cols" type="xs:integer"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<xs:complexType name="matrix">
<xs:simpleContent>
<xs:restriction base="matrixbase">
<xs:attribute name="rows" type="xs:integer" use="required"/>
<xs:attribute name="cols" type="xs:integer" use="required"/>
</xs:restriction>
</xs:simpleContent>
</xs:complexType>
<xs:complexType name="eulerangles">
<xs:simpleContent>
<xs:restriction base="matrixbase">
<xs:attribute name="rows" type="xs:integer" use="prohibited"/>
<xs:attribute name="cols" type="xs:integer" use="prohibited"/>
</xs:restriction>
</xs:simpleContent>
</xs:complexType>
</xs:schema>
一旦声明了所需的属性,就无法使它们在子类型中“消失”。解决方案可能是重新定义层次结构(matrixbase),使基类型声明属性是可选的;然后根据你的其他已建立的强制要求(矩阵)或禁止(eulerangles,四元数等)。
答案 1 :(得分:0)
我认为你应该能够做到这一点:
<xs:complexType name="eulerangles">
<xs:simpleContent>
<xs:restriction base="matrix">
<xs:attribute name="rows" type="xs:integer" fixed="3"/>
<xs:attribute name="cols" type="xs:integer" fixed="3"/>
</xs:restriction>
</xs:simpleContent>
</xs:complexType>
在XSD 1.1中,您可以添加断言
<xs:assert test="count(tokenize($value, ',')) = @rows * @cols"/>