XmlPrime是否支持类似于Saxon中的evaluate函数扩展的东西

时间:2013-09-05 15:24:57

标签: xslt-2.0 saxon xpath-2.0

我需要动态评估一些xpath表达式,我正在比较XmlPrime和Saxon有关如何执行此操作的选项。 我见过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! 明经

1 个答案:

答案 0 :(得分:1)

据我所知,在阅读文档时,他们没有提供Evaluate函数,但是它们允许您使用.NET代码(可以使用xp:script嵌入)来实现。{ / p>

基于此,我实现了一个用于测试的样式表:

<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>

使用XmlPrime 2.8(当前版本)编译并运行(使用命令行工具xslt.exe)。因此,当应用于像

这样的XML输入样本时
<root>
  <exp>local-name()</exp>
  <exp>count(node())</exp>
  <exp2>*[matches(., '\(\)')]</exp2>
</root>

我得到了像

这样的输出
<?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表达式和返回类型。