2016-04-17 49 views
1

我們的情況是,我們需要在我們的模型中支持XPath 1.0和函數current()(和一些其他函數),但我們沒有數據作爲XML文檔。 我們編寫了一個NodeInfo實現來處理非XML數據源問題。不能在非XSLT上下文中使用current()函數

但是,當我通過設定表示根作爲文檔對象,並使用同級元素另一個對象x作爲上下文節點的對象跑的以下種類

/a/b/c[name = current()/../x]/yy/uu/name 

的表達式,我得到了錯誤

當我調試我看到,在使用方面是個不能使用當前的()函數在非XSLT上下文

獨立的上下文。我如何獲得對current()函數的支持?我試圖通過改變表達式

/a/b/c[name = ./../x]/yy/uu/name 

但是,該.被解釋爲c

+0

哪個版本的薩克森你確切地使用它?爲什麼它必須是XPath 1.0,如果你使用Saxon 9,那麼你有XPath 2.0或9.7甚至XPath 3.0(你可以使用'let $ context:=。return/a/b/c [name = $ context /../ X]/YY/UU/name')。 –

+0

有一個規範給我,我需要支持。規範限制xpath 1.0和一些借用的函數,如current()。 – user19937

+0

有一個規範給我,我需要支持。規範限制xpath 1.0和一些借用的函數,如current()。我的實現可能使用任何東西,所以saxon 9.7當然是一種選擇,只要可以執行定製的NodeInfo實現。 – user19937

回答

1

撒克遜對一致性採取非常嚴格的態度,XPath規範不允許實現者在除了不同名稱空間之外添加自己的函數。 current()函數是在XSLT中定義的,並且函數的語義是用XSLT中唯一有意義的術語來定義的,儘管人們可以定義一個類似的函數來用於獨立的XPath表達式。在XPath的當前版本中,實際上不再需要,因爲您可以使用「let」綁定變量(如Martin Honnen所示)。

如果您準備深入內部接口,那麼撒克遜確實允許您擴展可用的功能集。例如,有XForms實現,它們使用下面的Saxon引擎,以及在XForms規範中定義的其他函數。細節取決於您使用的是哪個Saxon版本:靜態上下文是StandaloneContext的事實表明它是一個相當老的版本。如果你使用9.7,它可能是一個IndependentContext。 IndependentContext具有方法getFunctionLibrary()setFunctionLibrary(),可用於修改XPath解析器已知的一組函數。但要做到這一點,你必須熟悉撒克遜的內部。但是,如果您真的有義務實施以不符合規範的方式擴展XPath 1.0的規範,那麼您沒有太多選擇。

+0

我別無選擇,只能支持那件事。謝謝。我會研究9.7。我需要使用開源庫(以及不需要我們打開我們的代碼的許可證)。我們很樂意貢獻自定義代碼,但不能透露任何應用程序代碼。 Saxon 9.7是否允許這樣做? – user19937

相關問題