据我通过阅读文档可以看出,它们不提供Evaluate
函数,但它们允许您使用 .NET 代码(可以使用 .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编译并运行良好(使用命令行工具)。因此,当应用于 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 表达式和返回类型。