據我所知,他們沒有提供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表達式和返回類型。
我與他們聯繫,事實上這就是他們的建議,你也可以編程一個「本地模塊」。事情我已經做了,但現在我試圖看看是否有一種方法來傳遞上下文項目,而不是將其作爲參數傳遞。 – Vlax
這裏的本地模塊版本: https://gist.github.com/vladox/6465465 – Vlax