【问题标题】:Does XmlPrime supports something similar to the evaluate function extension in SaxonXmlPrime 是否支持类似于 Saxon 中的评估函数扩展的东西
【发布时间】:2013-09-05 15:24:56
【问题描述】:

我需要动态评估一些 xpath 表达式,并且我正在比较 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

我缺少什么或解决方法吗?

谢谢! 速度

【问题讨论】:

    标签: xslt-2.0 saxon xpath-2.0


    【解决方案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>
    

    使用 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 表达式和返回类型。

    【讨论】:

    • 我和他们联系过,他们确实是这么建议的,你也可以编写一个“原生模块”。我已经完成的事情,但现在我正在尝试查看是否有其他方法可以传递上下文项,而不是将其作为参数传递。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-10
    • 1970-01-01
    • 2011-12-04
    • 2011-01-07
    相关资源
    最近更新 更多