2

假设我有以下复杂类型

<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 很陌生。我非常感谢任何有助于改善我的风格的评论。

4

2 回答 2

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),使基类型声明属性可选;然后根据其他已建立的规则将它们设为强制(矩阵)或禁止(欧拉角、四元数等)。

于 2013-10-21T13:10:34.310 回答
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"/>
于 2013-10-21T14:58:52.357 回答