2016-11-19 137 views
0

我需要將節點作爲參數傳遞給XSL樣式表。問題是參數是以字符串形式發送的。我已經看到了關於這個主題的幾個SO問題,並且我知道該解決方案(在XSLT 1.0中)是使用外部函數node-set()將字符串轉換爲節點集。將節點作爲參數傳遞給XSL樣式表

我的問題是,我使用了eXist DB我不能似乎能夠得到它的XSLT處理器找到任何這樣的功能。我嘗試了命名空間http://exslt.org/common的EXSLT node-set()以及Saxon和Xalan版本(我認爲eXist曾經使用Xalan,但現在可能是Saxon)。

難道這些擴展,即使在由存在,則使用XSLT處理器是否允許?如果沒有,我還能做些什麼嗎?

+0

好了,你可以先檢查你使用的XSLT處理器的細節與像http://home.arcor.de/martin.honnen/xslt/processorTest3.xml樣式表來輸出屬性,如'系統屬性(「XSL: vendor')和system-property('xsl:product-version')''。至於您當前的嘗試,您是使用Java代碼執行XSLT轉換還是XQuery?考慮顯示該代碼傳遞參數並運行轉換的詳細信息。 –

+1

您不希望閱讀其他類似的SO問題/答案,除非它們與eXist特別相關,因爲將參數傳遞給XSLT轉換的方式取決於特定產品提供的API的詳細信息,並且因產品而異到另一個。 node-set()函數的目的不是解析作爲字符串提供的XML,儘管有些實現會這樣做。 –

+1

http://exist-db.org/exist/apps/fundocs/view.html?uri=http://exist-db.org/xquery/transform&location=java:org.exist.xquery.functions.transform.TransformModule&details =真表示有關參數的「使用XML片段具有下列結構的樣式表的參數可以在第三個參數進行傳遞:''」。這看起來好像參數,至少對於'transform'函數,只是名稱/值字符串對。 –

回答

1

按照馬丁Honnen的評論指這我不t認爲可以通過eXist中的transform:transform()函數的<parameters>結構傳遞XML節點。該函數似乎將作爲值傳遞給它的任何XML標籤去掉。

作爲一種變通方法我將包裹我的兩個輸入XML和我的參數XML成一個根元素,並傳遞作爲輸入提供給變換函數。

+2

你是對的。 transform:transform函數只允許字符串作爲變換的參數值,您推斷的解決方案是將輸入文檔修改爲變換以包裹參數節點。我們計劃在不久的將來將現在標準化的fn:transform(從XQuery 3.0)添加到eXist,以取代transform:transform,它將允許您發送節點(或任何類型)作爲參數。 – adamretter

+0

感謝您對亞當的澄清。 – pajevic

1

要引用或從數據庫中轉換文檔,你應該通過的路徑作爲參數的變換,然後使用參數和變量

(: xquery :) 

let $path-to-document := "/db/test/testa.xml" 
let $stylesheet := 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:param name="source" required="no"/> 
    <xsl:variable name="error"><error>doc not available</error></xsl:variable> 
    <xsl:variable name="theDoc" select="if (doc-available($source)) then doc($source) else $error"/> 
    <xsl:template match="/"> 
     <result><xsl:value-of select="$source"/> - <xsl:value-of select="node-name($theDoc/*)"/></result> 
    </xsl:template> 
</xsl:stylesheet> 


return transform:transform(<dummy/>,$stylesheet, <parameters><param name="source" value="xmldb:exist://{$path-to-document}"/></parameters>) 
+0

謝謝,但我的XML不在數據庫中。它是一個內存中的片段。 – pajevic