首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我可以显式地设置从分配给XSD中的元素的类型中获得的属性的值吗?

我可以显式地设置从分配给XSD中的元素的类型中获得的属性的值吗?
EN

Stack Overflow用户
提问于 2013-10-21 09:58:52
回答 2查看 81关注 0票数 2

假设我有以下复杂类型

代码语言:javascript
复制
<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矩阵):

代码语言:javascript
复制
<matrix rows=2 cols=2>1,2,3,4</matrix>

现在假设我想要基于这种类型创建一个元素,比如

代码语言:javascript
复制
<xs:element name="eulerangles" type="matrix">

在这种情况下,我仍然需要显式地设置行和cols属性,但是这个元素总是有3行和3列。是否可以将属性设置为模式中的特定数字,这样我就不需要显式地指定我需要3行3列

即不必写这篇文章:

代码语言:javascript
复制
<eulerangles rows=3 cols=3>1,2,3,4,5,6,7,8,9</eulerangles>

我希望能写成这样

代码语言:javascript
复制
<eulerangles>1,2,3,4,5,6,7,8,9</eulerangles>

同时仍有3行3科尔的“矩阵”类型。

注意:我对XML和XSD非常陌生。我真的很感激任何能帮助我改进风格的评论。

EN

回答 2

Stack Overflow用户

发布于 2013-10-21 13:10:34

XSD1.0中最接近的模型如下:

代码语言:javascript
复制
<?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>

一旦声明了所需的属性,就无法使它们在子类型中“消失”。解决方案可能是重新建立层次结构(矩阵基),让基类型声明属性是可选的;然后使它们成为强制性(矩阵)或禁止(euler角、四元数等)。和你其他的老牌一样。

票数 1
EN

Stack Overflow用户

发布于 2013-10-21 14:58:52

我认为你应该能做到:

代码语言:javascript
复制
<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>

在XSD1.1中,可以添加断言

代码语言:javascript
复制
<xs:assert test="count(tokenize($value, ',')) = @rows * @cols"/>
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19491410

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档