2011-03-28 48 views
6

如何验证具有属性的元素的文本长度。 例如:XSD for simplecontent with attribute and text

<sport code="FB">Football</sport> 

现在我需要限制的代码属性的可能值(如“FB”,“BB”,“TT”) 并且还我需要限制的可能的值和长度文本(“足球”,“篮球”,“乒乓球”)以及这些文本的最大长度(“足球”,“篮球”,“乒乓球”)可以是20。

我试图与

<complexType name="sport"> 
    <simpleContent> 
    <extension base="string"> 
     <attribute name="code" type="code" /> 
    </extension> 
    </simpleContent> 
</complexType> 
<simpleType name="code"> 
    <restriction base="string"> 
     <enumeration value="FB" /> 
     <enumeration value="BB" /> 
     <enumeration value="TT" /> 
    </restriction> 
</simpleType> 

但我不能验证文本“Foolball”的长度(也可能e值) 您可以请帮助我们如何验证代码和文本。 由于

+0

的可能重复的[XML模式:?元素与仅包含文本的属性(http://stackoverflow.com/questions/376582/xml-schema-element-with-attributes-containing-only-text) – Martijn 2013-02-05 13:39:30

回答

12

我有这个相同的问题,是有希望的,当我看到有一个公认的答案。然而,这个答案正是我所尝试的,但是我得到了一个模式无效的错误。显然,您不能在complexType范围内限制simpleContent,只能扩展它。此外,您不能在complexType内同时拥有一个属性和simpleContent。搜索在办公室周围的书籍的例子,我想出了一个解决方法,我适应的情况下,别人这个问题在未来有这个问题:

<?xml version="1.0" encoding="ISO-8859-1" ?> 
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
      xmlns:sp="http://www.ckhrysze.net/sports/1.0" 
      targetNamespace="http://www.ckhrysze.net/sports/1.0" 
     > 

    <xsd:element name="sports"> 
    <xsd:complexType> 
     <xsd:sequence> 
     <xsd:element name="sport" type="sp:sportType" minOccurs="1" maxOccurs="unbounded" /> 
     </xsd:sequence> 
    </xsd:complexType> 
    </xsd:element> 

    <xsd:complexType name="sportType"> 
    <xsd:simpleContent> 
     <xsd:extension base="sp:sportEnumeration"> 
     <xsd:attribute name="code" type="sp:codeEnumeration" /> 
     </xsd:extension> 
    </xsd:simpleContent> 
    </xsd:complexType> 

    <xsd:simpleType name="sportEnumeration"> 
    <xsd:restriction base="xsd:string"> 
     <xsd:enumeration value="Football" /> 
     <xsd:enumeration value="Basketball" /> 
    </xsd:restriction> 
    </xsd:simpleType> 

    <xsd:simpleType name="codeEnumeration"> 
    <xsd:restriction base="xsd:string"> 
     <xsd:enumeration value="FB" /> 
     <xsd:enumeration value="BB" /> 
    </xsd:restriction> 
    </xsd:simpleType> 

</xsd:schema> 
+0

这实际上对我来说是有效的,而不是上述解决方案。 – 2013-10-18 10:04:54

+0

这应该被标记为正确答案... – 2016-06-22 04:38:17

-1

元素必须是一个复杂的类型,其中内容是基于字符串,并以第相同的方式作为用于属性由枚举限制。另外,当您通过枚举进行限制时,这意味着最大长度。

请注意,不要对类型和元素/属性使用相同的名称,因为这会造成混淆。

编辑:增加了一个完整的例子:

<element name="sport" type="tns:SportType" /> 

<complexType name="SportType"> 
    <simpleContent> 
     <restriction base="string"> 
      <enumeration value="Football" /> 
      <enumeration value="Basketball" /> 
     </restriction> 
    </simpleContent> 
    <attribute name="code" type="tns:CodeType" /> 
</complexType> 

<simpleType name="CodeType"> 
    <restriction base="string"> 
     <enumeration value="FB" /> 
     <enumeration value="BB" /> 
    </restriction> 
</simpleType> 
+0

感谢。我已将元素修改为“complexttype”,并尝试在复杂类型“sport”下为体育名称(“Football”)添加“限制”。但我无法准确找到正确的方法。 – Thiyanesh 2011-03-28 10:03:40

+0

这似乎没有验证。在'attribute'标签上出现错误“**'属性'和内容模型互斥**”。请参阅http://stackoverflow.com/questions/376582/xml-schema-element-with-attributes-containing-only-text以获得更好的答案。 – Martijn 2013-02-05 13:37:06

+0

属性和内容模型是互斥的 – om471987 2013-05-24 14:53:07

1

我的元素:

<xsd:element name="From" type="FromType" minOccurs="0" maxOccurs="1"/> 

不验证枚举的合理值接受所有。

<xsd:complexType name="FromType"> 
     <xsd:simpleContent> 
      <xsd:extension base="FromTypeEnum"> 
       <xsd:attribute name="acronym" type="xsd:string"/> 
      </xsd:extension> 
     </xsd:simpleContent> 
    </xsd:complexType> 

    <xsd:simpleType name="FromTypeEnum"> 
     <xsd:restriction base="xsd:string"> 
      <xsd:enumeration value="Discard"> 
       <xsd:annotation> 
        <xsd:documentation>Discard</xsd:documentation> 
       </xsd:annotation> 
      </xsd:enumeration> 
      <xsd:enumeration value="SANDBOX"> 
       <xsd:annotation> 
        <xsd:documentation>SANDBOX</xsd:documentation> 
       </xsd:annotation> 
      </xsd:enumeration> 
      <xsd:enumeration value="Catalogue"> 
       <xsd:annotation> 
        <xsd:documentation>Catalogue</xsd:documentation> 
       </xsd:annotation> 
      </xsd:enumeration> 
      <xsd:enumeration value="Current experimentation"> 
       <xsd:annotation> 
        <xsd:documentation>Current experimentation</xsd:documentation> 
       </xsd:annotation> 
      </xsd:enumeration> 
      <xsd:enumeration value="Current session"> 
       <xsd:annotation> 
        <xsd:documentation>Current session</xsd:documentation> 
       </xsd:annotation> 
      </xsd:enumeration> 
      <xsd:enumeration value="Restart"> 
       <xsd:annotation> 
        <xsd:documentation>Restart</xsd:documentation> 
       </xsd:annotation> 
      </xsd:enumeration> 
     </xsd:restriction> 
    </xsd:simpleType> 
0

的解决问题的方法是创建一个simpleContentextensionbase被限制的一种方式,其attribute约束另一个。

XML模式

<?xml version="1.0" encoding="UTF-8"?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:element name="sport" type="sportType" /> 

    <xs:complexType name="sportType"> 
     <xs:simpleContent> 
      <xs:extension base="sportNameType"> 
       <xs:attribute name="code" type="sportCodeType" /> 
      </xs:extension> 
     </xs:simpleContent> 
    </xs:complexType> 

    <xs:simpleType name="sportNameType"> 
     <xs:restriction base="xs:string"> 
      <xs:enumeration value="Football" /> 
      <xs:enumeration value="Basketball" /> 
      <xs:maxLength value="20"/> 
     </xs:restriction> 
    </xs:simpleType> 

    <xs:simpleType name="sportCodeType"> 
     <xs:restriction base="xs:string"> 
      <xs:enumeration value="FB" /> 
      <xs:enumeration value="BB" /> 
     </xs:restriction> 
    </xs:simpleType> 
</xs:schema> 

正确验证所需XML实例文档

<?xml version="1.0" encoding="UTF-8"?> 
<sport code="FB">Football</sport> 

注#1:maxLength元素满足您的要求之一,但不是真正必要的,因为体育名称列举。

注#2:此架构不强制运动名称和运动代码之间的关联。换句话说,这种模式也证实了这一点XML:

<?xml version="1.0" encoding="UTF-8"?> 
<sport code="BB">Football</sport> 

为了解决这个问题,你要么需要使用的Schematron或XSD 1.1。