2013-07-05 88 views
1

我试图写的以下XML示例XSD架构:这个XML应该是什么模式?

<?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必须具有两个属性:requiredboolean & commentstring,非零长度的,不共mposed完全空白的空间和/或标点符号
  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"/> 

我错过了什么?我已经花了几个小时了!

回答

1

你非常接近。

你说的第三个约束不被强制执行,但你看不说明不执行的例子:元素

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

具有零长度字符串的内容。您告诉XSD验证程序,当您说loc的类型是xs:string的扩展时,那是可以的。

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

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

如果你没有,那么你的要求是不是评论和LOC应该有字符串值,也不能说他们应该有非空字符串值,但更严格一些。理想情况下,您希望它们具有有用的,明智的值,但是可能无法正式定义一组有用的注释或一组有用的loc值。有些人表示他们想要一个非空字符串,它不是完全由空格和标点符号组成(因此它至少有一个字符与类\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> 
+0

您提出了一个很好的空白处!我改进了我的定义,以照顾它。 –

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> 
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>