我傾向於使用外部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?這顯然不是一個大問題,但我對此很好奇。
這絕對是輝煌!我假設XJC處理器使用XSLT 1.0,所以我將遠離XPath 2的功能。第一種語法有點過於冗長,無法散佈在整個綁定文件中。但很高興看到它真的有可能。謝謝! – 2011-04-12 13:55:34
@G_H:不客氣! – 2011-04-12 15:00:47