2013-09-05 45 views
0

我需要動態評估一些xpath表達式,並且我正在比較XmlPrime和Saxon以瞭解有關如何執行此操作的選項。 我看到撒克遜支持它:XmlPrime是否支持類似於Saxon中評估函數擴展的東西

http://saxon.sourceforge.net/saxon7.9/extensions.html#evaluate http://www.saxonica.com/documentation/index.html#!extensions/functions/saxon-extension-functions

,但我不能在XmlPrime文檔類似的東西:

http://www.xmlprime.com/xmlprime/doc/2.6/P_XmlPrime_XdmModule_XsltFunctions.htm

它的存在,我丟失的東西或替代方法到它?

Thxs! Vlax

回答

1

據我所知,他們沒有提供Evaluate函數,但他們允許您使用.NET代碼(可以使用xp:script嵌入)來實現它們。

此基礎上我實現了一個用於測試的樣式表:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:xp="http://www.xmlprime.com/" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    xmlns:mf="http://example.com/mf" 
    exclude-result-prefixes="xp xs mf"> 


<xp:script implements-prefix="mf" language="C#"><![CDATA[ 
public static IEnumerable<System.Xml.XPath.XPathItem> Evaluate(string exp, XPathItem contextItem) 
{ 
    XPath path = XPath.Compile(exp); 
    return path.Evaluate(contextItem); 
} 
]]></xp:script> 

<xsl:template match="@* | node()" mode="#all"> 
    <xsl:copy> 
    <xsl:apply-templates select="@* , node()" mode="#current"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="exp"> 
    <xsl:copy> 
    <result><xsl:sequence select="mf:Evaluate(., .)"/></result> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="exp2"> 
    <xsl:copy> 
    <result> 
     <xsl:apply-templates select="mf:Evaluate(., /*)" mode="test1"/> 
    </result> 
    </xsl:copy> 
</xsl:template> 

</xsl:stylesheet> 

,編譯和運行良好(使用命令行工具xslt.exe)與XmlPrime 2.8,最新的版本。所以,當像

<root> 
    <exp>local-name()</exp> 
    <exp>count(node())</exp> 
    <exp2>*[matches(., '\(\)')]</exp2> 
</root> 

應用於XML輸入採樣我得到這樣

<?xml version="1.0" encoding="UTF-8"?><root> 
    <exp><result>exp</result></exp> 
    <exp><result>1</result></exp> 
    <exp2><result><exp>local-name()</exp><exp>count(node())</exp></result></exp2> 
</root> 

您可能需要檢查回來XmlPrime的實施者這種做法是否是一個很好的使用他們的API的輸出,我從http://www.xmlprime.com/xmlprime/doc/2.8/native-modules.htm開始有一個示例,然後在其API中查找XPath評估。但是我當然沒有仔細閱讀他們的文檔,也沒有運行測試套件來確保該方法涵蓋所有​​類型的XPath表達式和返回類型。

+0

我與他們聯繫,事實上這就是他們的建議,你也可以編程一個「本地模塊」。事情我已經做了,但現在我試圖看看是否有一種方法來傳遞上下文項目,而不是將其作爲參數傳遞。 – Vlax

+1

這裏的本地模塊版本: https://gist.github.com/vladox/6465465 – Vlax

相關問題