2015-02-11 74 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> 
相關問題