2012-03-09 111 views
2

我是新來的XSD驗證,並正在試圖驗證是否選擇標記有元素的一個特定羣體,但也有那些與任意命名。像下面這樣:xsd中的元素是否可以具有任意名稱?

... 
<xs:choice> 
    <xs:element name="test1" type="xs:string" /> 
    <xs:element name="test2" type="xs:string" /> 
    <xs:element name="-some regex or something to specify arbitrary name here" type="xs:string" /> 
</xs:choice> 
... 

XML:

... 
<test1>example text</test1> 
<test2>example text again</test2> 
<exampleNode>example text</exampleNode> 
... 

這是可能的XSD?爲了驗證新的任意命名的節點?

回答

5

您可以使用xs:any通配符來允許任何元素名稱或特定命名空間集合內的任何名稱。您無法進一步限制名稱(除非在XSD 1.1中使用斷言)。

在XML設計中,使用具有內部結構的名稱(例如address-line-1,address-line-2,address-line-3)總是不好的做法。在這種情況下,更好的設計是<address-line nr="1">等於是允許符合一些正則表達式暗示設計不良名稱的想法。一般來說,XML Schema的設計目的是爲設計糟糕的詞彙表編寫模式很困難或不可能。

+0

這與我一起工作的XML絕對是糟糕的設計,我會給你的。 – Slamice 2012-03-09 11:23:45

0

應該使用實體引用: 架構:

<xsd:schema xmlns:xsd="http://www.w3.org/1999/XMLSchema"> 
    <xsd:element name="Ferrari"/> 
    <xsd:element name="Lambo"/> 
    <xsd:element name="&supercar;"/> 
</xsd:schema> 

的XML文檔:

<?xml version="1.0"?> 
<!DOCTYPE xsd:schema PUBLIC "-//W3C//DTD XML Schema 20000406//EN" "XMLSchema.dtd" [ <!ENTITY % p 'xsd:'> <!ENTITY % s ':xsd'> 
<!ENTITY supercar 'McLaren'> 
]> 

要改變你的動態域名,在XML文檔中定義的模式時,只需改變超級跑車的名字。 我沒有測試這一點,但它應該給你如何實現你想要做什麼的想法。

2

試試這個:minOccurs="0"使它成爲非強制性的。

<xs:choice> 
    <xs:element name="test1" type="xs:string" /> 
    <xs:element name="test2" type="xs:string" /> 
    <xs:any minOccurs="0"/> 
</xs:choice> 
相關問題