我需要将一个节点作为参数传递给XSL样式表。问题是参数是作为字符串发送的。我已经看到了关于这个主题的几个SO问题,我知道解决方案(在XSLT 1.0中)是使用外部node-set()
函数将字符串转换为节点集。
我的问题是我使用的是eXist DB我似乎无法让它的XSLT处理器找到任何这样的功能。我已尝试过命名空间node-set()
中的EXSLT http://exslt.org/common
以及Saxon和Xalan版本(我认为eXist过去常常使用Xalan但现在可能是Saxon)。
在eXist使用的XSLT处理器中是否允许这些扩展?如果没有,我还能做些什么吗?
答案 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函数。