2015-02-11 113 views
1

我正在尝试创建一个用于验证XML文件的XSD,并且一些元素需要具有属性,但没有文本。XML架构:如何允许具有属性但没有文本的元素?

例如这应该被认为是有效的:

<DEPRECATED value="blah"/> 

这是无效的:

<DEPRECATED>blah</DEPRECATED> 
<DEPRECATED value="blah">bad text</DEPRECATED> 

我试图宣布一个复杂的空元素描述here,但无论我解释的例子不正确或例子本身就是错的(见下面的错误):

<xs:element name="DEPRECATED" type="stringValue" minOccurs="0" maxOccurs="1"/> 

<xs:complexType name="stringValue"> 
     <xs:complexContent> 
      <xs:restriction base="xs:integer"> 
       <xs:attribute name="value" type="xs:string"/> 
      </xs:restriction> 
     </xs:complexContent> 
</xs:complexType> 

错误:复杂类型定义描述误差为类型 'stringValue的'。何时使用,基本类型必须是complexType。 'integer'是一个simpleType。

我也试图定义复杂类型是这样的:

<xs:complexType name="stringValue"> 
    <xs:attribute name="value" type="xs:string"/> 
</xs:complexType> 

但是,考虑以上为有效无效的例子。 [编辑:校正,上述确实工作]

我也打得四处的答案类似的问题(Define an XML element that must be empty and has no attributesPrevent Empty Elements in XML via XSD),但没有运气。

如何验证元素具有属性,但没有文本?

+0

哎呀 - 答案是问题。上面定义的complexType工作,我的XML文件存在问题。 – Sasha 2015-02-11 20:37:42

回答

0

这个XML将是有效的

<DEPRECATED value="blah"/> 

这个XML

<DEPRECATED>blah</DEPRECATED> 

这个XML

<DEPRECATED value="blah">bad text</DEPRECATED> 

都将使用此XSD无效:

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

    <xs:element name="DEPRECATED"> 
    <xs:complexType> 
     <xs:attribute name="value"/> 
    </xs:complexType> 
    </xs:element> 

</xs:schema> 
+0

奇数 - 当我尝试这个,它仍然认为坏文有效(我没有尝试其他无效的情况下)。 DEPRECATED元素本身是否属于另一个复杂类型的序列是否重要?将原始问题添加详细信息... – Sasha 2015-02-11 20:16:59

+0

不,这应该不重要。如果您仍然遇到麻烦,请提供***确切的*** XSD和XML以及错误消息,因为处于序列中,或者正在匿名或明确定义应该无关紧要。谢谢。 – kjhughes 2015-02-11 20:25:06

+0

谢谢。我发现这个问题 - 我的文件中的弃用元素(我期望无效)是另一个元素的子元素,而不是“属性”元素。 – Sasha 2015-02-11 20:39:45

0

我觉得你像这样

<xs:schema elementFormDefault="qualified" version="1.0" 
    targetNamespace="stackoverflow" xmlns:tns="stackoverflow" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema"> 

    <xs:element name="Test"> 
     <xs:complexType> 
      <xs:sequence> 
       <xs:element name="DEPRECATED" type="tns:deprecatedType" /> 
      </xs:sequence> 
     </xs:complexType> 
    </xs:element> 

    <xs:complexType name="deprecatedType"> 
     <xs:attribute name="number" /> 
    </xs:complexType> 
</xs:schema> 

该XML文档有效

<sf:Test xmlns:sf="stackoverflow" 
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
      xsi:schemaLocation="stackoverflow test.xsd"> 
    <sf:DEPRECATED number="123"/> 
</sf:Test> 

此XML文档无效后

<sf:Test xmlns:sf="stackoverflow" 
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
      xsi:schemaLocation="stackoverflow test.xsd"> 
    <sf:DEPRECATED number="123">TEST</sf:DEPRECATED> 
</sf:Test> 

如果你想限制属性,您可能需要这样的:

<xs:complexType name="deprecatedType"> 
    <xs:attribute name="number"> 
     <xs:simpleType> 
      <xs:restriction base="xs:string" /> 
     </xs:simpleType> 
    </xs:attribute> 
</xs:complexType> 
+0

对不起。并不意味着要冒犯。原来的问题似乎试图增加对属性的限制,所以试图说明如何做到这一点,并将整个事情放在完整的背景下。 – 2015-02-11 20:14:15

+0

没有冒犯,谢谢你的回答! – Sasha 2015-02-11 20:21:22

+0

看起来像原来的评论被删除。希望答案有帮助 – 2015-02-11 20:24:01

0

试试这个:

<xsd:simpleType name="EmptyType"> 
    <xsd:restriction base="xsd:string"> 
     <xsd:length value="0" /> 
    </xsd:restriction> 
    </xsd:simpleType> 
    <xsd:complexType name="DeprecatedType"> 
    <xsd:simpleContent> 
     <xsd:extension base="EmptyType"> 
     <xsd:attribute name="value" type="xsd:string" /> 
     </xsd:extension> 
    </xsd:simpleContent> 
    </xsd:complexType> 
相关问题