将节点作为参数传递给XSL样式表

时间:2016-11-19 15:24:36

标签: xslt exist-db exslt

我需要将一个节点作为参数传递给XSL样式表。问题是参数是作为字符串发送的。我已经看到了关于这个主题的几个SO问题,我知道解决方案(在XSLT 1.0中)是使用外部node-set()函数将字符串转换为节点集。

我的问题是我使用的是eXist DB我似乎无法让它的XSLT处理器找到任何这样的功能。我已尝试过命名空间node-set()中的EXSLT http://exslt.org/common以及Saxon和Xalan版本(我认为eXist过去常常使用Xalan但现在可能是Saxon)。

在eXist使用的XSLT处理器中是否允许这些扩展?如果没有,我还能做些什么吗?

2 个答案:

答案 0 :(得分:1)

要从数据库中引用或转换文档,您应该将路径作为参数传递给转换,然后使用参数和变量引用它

(: xquery :)

let $path-to-document := "/db/test/testa.xml"
let $stylesheet := 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:param name="source" required="no"/>
    <xsl:variable name="error"><error>doc not available</error></xsl:variable>
    <xsl:variable name="theDoc" select="if (doc-available($source)) then doc($source) else $error"/>
    <xsl:template match="/">
       <result><xsl:value-of select="$source"/> - <xsl:value-of select="node-name($theDoc/*)"/></result>
    </xsl:template>
</xsl:stylesheet>


return transform:transform(<dummy/>,$stylesheet, <parameters><param    name="source" value="xmldb:exist://{$path-to-document}"/></parameters>)

答案 1 :(得分:1)

根据Martin Honnen的评论,我不认为可以通过eXist中<parameters>函数的transform:transform()结构传递XML节点。该函数似乎剥离了作为值传递给它的任何XML标记。

作为一种解决方法,我将输入XML和参数XML都包装到根元素中,并将其作为输入传递给transform函数。