2012-12-18 47 views
2

我正在嘗試爲通過的一段代碼生成的XML創建XML架構。我將描述我的問題的簡化版本。假設由此代碼生成的XML文件描述了一個文本文檔;它看起來像這樣:我可以在XML Schema元素名稱中使用正則表達式嗎?

<document> 
    <r1>A line of text</r1> 
    <r2 style="bold">Another line which is bold</r2> 
    <r3>Yet another line</r3> 
</document> 

依此類推。我知道不是最好的設計 - 如果行數是屬性,那會更好,但這是我必須處理的。它代表了行號是問題。有沒有什麼方法可以編寫一個Schema,讓我爲元素名稱指定正則表達式(或類似的)?我預計XSD文件看起來在某種程度上是這樣的:

<?xml version="1.0" encoding="UTF-8"?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 
     targetNamespace="http://www.example.org/SimpleSchema" 
     xmlns:tns="http://www.example.org/SimpleSchema" 
     elementFormDefault="qualified"> 
    <xs:element name="document"> 
     <xs:complexType> 
      <xs:sequence> 
       <xs:element name="rX" minOccurs="1" maxOccurs="unbounded"> 
        <xs:complexType> 
         <xs:simpleContent> 
          <xs:extension base="xs:string"> 
           <xs:attribute name="style" type="xs:string" /> 
          </xs:extension> 
         </xs:simpleContent> 
        </xs:complexType> 
       </xs:element> 
      </xs:sequence> 
     </xs:complexType> 
    </xs:element> 
</xs:schema> 

...其中,「RX」第9行是什麼表情,需要表示「一個名稱以[R,並用X結尾,這是整數「。

我寧願避免自己修復生成代碼,所以我想看看是否有可能首先編寫合適的XML Schema。在此先感謝大家。

回答

6

XSD要求字面上指定元素名稱;我認爲你所考慮的那種聲明是不被支持的。正如你所描述的(一個以r開頭並以X結尾的名字,它是一個整數),你想寫的聲明會在模式中產生無數個元素組件;我知道唯一支持這種事情的語法形式是由Aard van Wijngaarden爲Algol 68開發的兩級語法。

所以在短期內,您的最佳選擇似乎是更改生成代碼,或者爲您所需的聲明創建自己的符號並從中生成合法的XSD模式文檔。

+0

我想我最終會做到這一點。 – Btz

0

我並不是所有人都熟悉XSD文件的RegEx功能,但表達式本身非常簡單。

這將捕獲「rX」行號。如果你不能利用一個捕獲組,你可以簡單地使用它。

[Rr][0-9]{1,} 
4

在XSD 1.1,你可以使用XS:任何允許使用任何名稱的元素,然後用斷言名稱限制到一個正則表達式匹配:

<xs:complexType> 
     <xs:sequence> 
      <xs:any minOccurs="1" maxOccurs="unbounded"/> 
     </xs:sequence> 
     <xs:assertion test="every $x in * 
          satisfies matches(local-name($x), '[Rr][0-9]+')"/> 
    </xs:complexType> 

XSD 1.1,目前在實施Xerces(測試版)和Saxon(9.4)。

+0

有趣,但我不確定我可以使用XSD 1.1。不幸的是,我的手與使用什麼工具和庫有關。我會檢查。 – Btz

相關問題