2013-09-05 38 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

相关问题