1

我正在尝试为以下 XML 示例编写 XSD 架构:

<?xml version="1.0" encoding="UTF-8"?>
<locs xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="loc.xsd">
    <loc required="true"  comment="A comment">ABC</loc>
</locs>

我试图在架构中强制执行这些规则的规则:

  1. 根元素locs必须有 1 个或多个元素loc
  2. loc必须有 2 个属性:requiredis a boolean& commentis a string,长度非零,不完全由空格和/或标点符号组成
  3. loc必须有一个非零长度的字符串值,不完全由空格和/或标点符号组成

我已经做到了loc.xsd如下:

<?xml version="1.0" encoding="utf-8"?>
<xs:schema elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:element name="locs">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="loc" minOccurs="1" maxOccurs="unbounded">
                    <xs:complexType>
                        <xs:complexContent>
                            <xs:extension base="xs:string">
                                <xs:attribute name="required" type="xs:boolean" use="required"/>
                                <xs:attribute name="comment" type="xs:string" use="required"/>
                            </xs:extension>
                        </xs:complexContent>
                    </xs:complexType>
                </xs:element>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
</xs:schema>

有了这个,我可以执行规则 1 和 2,但是第三条规则没有被执行,所以像下面这样的条目是有效的:

<loc required="false"  comment="Another comment"/>

我错过了什么?我已经在这上面花了几个小时了!

4

3 回答 3

2

试试这个 - 它可以工作

<?xml version="1.0" encoding="utf-8"?>
<xs:schema elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:simpleType name="nonEmptyString">
        <xs:restriction base="xs:string">
            <xs:minLength value="1" />
            <xs:whiteSpace value="collapse" />
        </xs:restriction>
    </xs:simpleType>

    <xs:complexType name="loc_type">
        <xs:simpleContent>
            <xs:extension base="nonEmptyString">
                <xs:attribute name="required" type="xs:boolean" use="required"/>
                <xs:attribute name="comment" type="nonEmptyString" use="required"/>
            </xs:extension>
        </xs:simpleContent>
    </xs:complexType>

    <xs:element name="locs">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="loc" type="loc_type" minOccurs="1" maxOccurs="unbounded" />
            </xs:sequence>
        </xs:complexType>
    </xs:element>
</xs:schema>
于 2013-07-05T17:57:17.830 回答
1

你很亲密。

你说第三个约束没有被强制执行,但你展示的例子并没有说明不强制执行:元素

<loc required="false"  comment="Another comment"/>

有一个长度为零的字符串作为内容。当您说 loc 的类型是 xs:string 的扩展时,您告诉 XSD 验证器这没问题。

Jirka Š. 的回答说明了您需要采取的方法。如果您对任何非空字符串感到满意,则可以逐字采用该解决方案。但在你这样做之前,请确保你愿意接受这样的实例:

<loc required="false"  comment="&#x9; ">  </loc>

如果你不是,那么你的要求不是 comment 和 loc 应该有字符串值,也不是他们应该有非空字符串值,而是更严格的东西。当然,理想情况下,您希望它们具有有用的、合理的值,但可能无法正式定义有用的注释集或有用的 loc 值集。有些人满足于说他们想要一个不完全由空格和标点符号组成的非空字符串(因此它至少有一个与 class 匹配的字符\w)。

<xs:simpleType name="nonEmptyNonWSString">
  <xs:restriction base="xs:string">
    <xs:minLength value="1" />
    <xs:pattern value="(\W)*\w(\W|\w)*"/>
  </xs:restriction>
</xs:simpleType>
于 2013-07-05T18:22:06.220 回答
0

谢谢大家的回答,希望我能接受他们两个!这是我最终采用的(也修改了问题以消除混淆):

<?xml version="1.0" encoding="utf-8"?>
<xs:schema elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <!-- Must be a string of non-zero length, not composed entirely of whitespace and punctuation marks -->
    <xs:simpleType name="nonEmptyString">
        <xs:restriction base="xs:string">
            <xs:minLength value="1"/>
            <xs:whiteSpace value="collapse"/>
            <xs:pattern value="(\W)*\w(\W|\w)*"/>
        </xs:restriction>
    </xs:simpleType>
    <xs:element name="locs">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="loc" minOccurs="1" maxOccurs="unbounded">
                    <xs:complexType>
                        <xs:simpleContent>
                            <xs:extension base="nonEmptyString">
                                <xs:attribute name="required" type="xs:boolean" use="required"/>
                                <xs:attribute name="comment" type="nonEmptyString" use="required"/>
                            </xs:extension>
                        </xs:simpleContent>
                    </xs:complexType>
                </xs:element>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
</xs:schema>
于 2013-07-06T07:33:36.013 回答