从 XSLT 调用 XQuery,在 XQuery 中动态构建 XSLT?

calling XQuery from XSLT, building XSLT dynamically in XQuery?

环境:eXist-db 4.2.1、XQuery 3.1、XSLT 2.0

我需要使用 XQuery 在 eXist-DB 中执行 XSLT 转换。有一次,XSLT 需要在数百个文档中搜索节点属性值的匹配项。从 eXist-DB 中的 XSLT 调用 collection() seems to not work .

我已经搜索了一些其他方法来解决这个问题,但没有找到任何东西,我在这里发布两个问题:

  1. 是否可以从 XQuery 动态编写和转换 XSLT,从而允许我从 XQuery 本身动态注入值(xquery transform:transform() 上的参数在这里不够)

  2. 是否有可能 call/retrieve 来自 XSLT 的 (eXist) XQuery document/function 结果?

感谢任何意见和参考。

因为 XSLT 是 XML 并且使用 XQuery 你可以构建 XML 你当然可以动态构建 XSLT 并将你在其他地方收集的数据注入到 XQuery 中,下面显然是一个愚蠢的例子但是它在 XQuery 中构造一些数据,即时创建一个 XSLT 样式表,将一些数据直接内联作为参数值注入,然后运行 ​​XSLT:

declare namespace xsl = "http://www.w3.org/1999/XSL/Transform";

let $elements := (1 to 3)!<root><data>{.}</data></root>,
    $stylesheet := 
      <xsl:stylesheet version="2.0">
        <xsl:param name="data-elements" as="element()*">{$elements!data}</xsl:param>
        <xsl:template match="@* | node()">
          <xsl:copy>
             <xsl:apply-templates select="@* | node()"/>
          </xsl:copy>
        </xsl:template>
        <xsl:template match="foo[. = $data-elements]"/>
      </xsl:stylesheet>,
    $input := <root><list><foo>a</foo><foo>2</foo><foo>10</foo><foo>1</foo></list></root>
return transform:transform($input, $stylesheet, ())