2011-04-12 81 views
3

我傾向於使用外部JAXB綁定文件進行我的模式到Java編譯。這工作得很好,但我注意到我開始想知道的一件事。這不是特別針對JAXB,更像是XPath問題,但上下文有幫助。JAXB綁定文件:名稱空間感知節點選擇

假設我們有這樣的模式:

<?xml version="1.0" encoding="UTF-8"?> 
<xs:schema 
xmlns:xs="http://www.w3.org/2001/XMLSchema" 
xmlns:test="www.acme.com" 
targetNamespace="www.acme.com" 
elementFormDefault="qualified" attributeFormDefault="unqualified"> 

    <xs:element name="el1"/> 

    <xs:complexType name="testType"> 
    <xs:sequence> 
     <xs:element ref="test:el1"/> 
    </xs:sequence> 
    </xs:complexType> 

</xs:schema> 

在複雜的數據類型元素的引用,需要前綴「測試」,必將對我國的目標命名空間,找到元素定義。如果我們省略了前綴,模式處理器會抱怨它找不到它引用的元素。很明顯,引用是一個限定名稱,架構處理器知道這一點。

現在採取以下綁定文件提取的XJC:

<bindings node="//xs:complexType[@name='testType']"> 
    <bindings node=".//xs:element[@ref='test:el1']"> 
    <property name="element1"/> 
    </bindings> 
</bindings> 

複雜類型的結合是顯而易見的。我們按名稱選擇它,並且xs前綴綁定在綁定文件的根目錄中(此處未顯示)。它可能是xsd
我錯了什麼是嵌套綁定。在我們複雜類型節點的上下文中,我們選擇一個xs:element節點,其屬性ref的值爲test:el1。但是,這個價值只是被視爲文字。 XML處理器不知道它應該是一個合格的名稱,而test:實際上是綁定到名稱空間的前綴聲明。

現在我知道我很挑剔,但實際的前綴字符串應該沒有重要性,只有名稱空間URI本身。有人可以將模式中的test前綴更改爲acme,並且它在語義上仍然是相同的模式。但是,我的綁定文件將不再起作用。

那麼,有沒有什麼方法可以在不依賴前綴知識的情況下構建XPath表達式,只有名稱空間URI?這顯然不是一個大問題,但我對此很好奇。

回答

4

有什麼辦法來構建 XPath表達式,而不依賴於前綴的 知識,只有 命名空間URI?

如果你談論的屬性值,這是的XPath 1.0

.//xs:element[ 
    namespace::*[ 
     . = 'www.acme.com' 
    ][ 
     susbtring-before(
     ../@ref, 
     ':' 
    ) 
    = name() 
    ] 
and 
    substring(
     concat(':', @ref), 
     string-length(@ref) - 1 
    ) 
= 'el1' 
] 

在XPath 2.0更加簡單:

.//xs:element[resolve-QName(@ref,.) eq QName('www.acme.com','el1')] 
+1

這絕對是輝煌!我假設XJC處理器使用XSLT 1.0,所以我將遠離XPath 2的功能。第一種語法有點過於冗長,無法散佈在整個綁定文件中。但很高興看到它真的有可能。謝謝! – 2011-04-12 13:55:34

+0

@G_H:不客氣! – 2011-04-12 15:00:47