Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xslt 将节点作为参数传递给XSL样式表_Xslt_Exist Db_Exslt - Fatal编程技术网

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

Xslt 将节点作为参数传递给XSL样式表,xslt,exist-db,exslt,Xslt,Exist Db,Exslt,我需要将节点作为参数传递给XSL样式表。问题是参数将作为字符串发送。我已经看到了关于这个主题的几个SO问题,我知道解决方案(在XSLT1.0中)是使用外部node-set()函数将字符串转换为节点集 我的问题是,我使用的是existdb,我似乎无法让它的XSLT处理器找到任何这样的函数。我已经从名称空间中尝试了EXSLTnode-set()http://exslt.org/common以及Saxon和Xalan版本(我认为eXist过去使用Xalan,但现在可能是Saxon) eXist使用的X

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

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


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

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

(: 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>)
(:xquery:)
让$path指向文档:=“/db/test/testa.xml”
let$stylesheet:=
文件不可用
- 
返回转换:转换(,$stylesheet,)

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

(: 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>)
(:xquery:)
让$path指向文档:=“/db/test/testa.xml”
let$stylesheet:=
文件不可用
- 
返回转换:转换(,$stylesheet,)

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


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

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


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

首先,您可以使用样式表检查所用XSLT处理器的详细信息,例如输出属性,如
系统属性('xsl:vendor')
系统属性('xsl:product version')
。至于您当前的尝试,您是在使用Java代码执行XSLT转换还是XQuery?考虑显示代码通过参数并运行转换的细节。如果不具体涉及到存在,则不想阅读其他类似的问题/答案,因为将参数传递给XSLT转换的方式取决于特定产品所提供的API的细节,这在不同的产品中是不同的。node-set()函数的目的不是解析作为字符串提供的XML,尽管有些实现会这样做。关于参数,“样式表参数可以使用具有以下结构的XML片段在第三个参数中传递:
”。至少对于
transform
函数而言,这看起来好像参数只是名称/值字符串对,似乎确实确认了参数被视为java.util.Properties。但希望一些现有的用户或开发人员能够提供更明智的答案。@Martin Honnen是的,我确实在使用XQuery函数transform:transform()来运行转换。我想你是对的。服务器似乎会删除传递给它的所有XML标记。因此,我认为根本无法重新创建节点。首先,您可以使用样式表检查所用XSLT处理器的详细信息,例如输出属性,如
system property('xsl:vendor')
system property('xsl:product version')
。至于您当前的尝试,您是在使用Java代码执行XSLT转换还是XQuery?考虑显示代码通过参数并运行转换的细节。如果不具体涉及到存在,则不想阅读其他类似的问题/答案,因为将参数传递给XSLT转换的方式取决于特定产品所提供的API的细节,这在不同的产品中是不同的。node-set()函数的目的不是解析作为字符串提供的XML,尽管有些实现会这样做。关于参数,“样式表参数可以使用具有以下结构的XML片段在第三个参数中传递:
”。至少对于
transform
函数而言,这看起来好像参数只是名称/值字符串对,似乎确实确认了参数被视为java.util.Properties。但希望一些现有的用户或开发人员能够提供更明智的答案。@Martin Honnen是的,我确实在使用XQuery函数transform:transform()来运行转换。我想你是对的。服务器似乎会删除传递给它的所有XML标记。因此,我认为根本无法重新创建节点。谢谢,但我的XML不在数据库中。这是内存中的片段。谢谢,但我的XML不在数据库中。这是一个内存中的片段。你是对的。transform:transform函数只允许字符串作为转换的参数值,您推断的解决方案是将输入文档修改为转换,以包装参数节点。我们计划在不久的将来添加现在标准化的fn:transform(来自XQuery 3.0),以取代transform:transform,它将允许您将节点(或任何类型)作为参数发送。感谢您的澄清。您是正确的。transform:transform函数只允许字符串作为转换的参数值