将XSLT2.0函数iri to uri替换为uri';来自通过Java传入的参数的

将XSLT2.0函数iri to uri替换为uri';来自通过Java传入的参数的,java,xml,xslt,saxon,Java,Xml,Xslt,Saxon,我有一些XSL文件,可以循环处理目录中的所有文件,基本上它读取一个名为collection的变量: <xsl:variable name="collection"> <xsl:copy-of select="collection(iri-to-uri('./?select=*.xml;recurse=yes'))/*"/> </xsl:variable> 后来,我们有了这样的东西: <xsl:for-each-group

我有一些XSL文件,可以循环处理目录中的所有文件,基本上它读取一个名为collection的变量:

<xsl:variable name="collection">
        <xsl:copy-of select="collection(iri-to-uri('./?select=*.xml;recurse=yes'))/*"/>
    </xsl:variable>

后来,我们有了这样的东西:

<xsl:for-each-group     select="$collection/configuration/services/service" group-by="serviceKey" >


这在一段时间内还可以,但现在我想传入组成变量集合的文件列表。我正在使用java,因此我可以有效地传递一个逗号分隔的文件列表、路径或URI,但我不确定如何在XSL文件中处理它,以便它像递归iri to URI函数一样填充集合变量。

如果要将文档列表从环境传递到样式表,使用文档节点序列:

<xsl:param name="docs" as="document-node()+"/>
PS:在您的示例中不需要
iri-to-uri()


PS II:注意操作员
是3.0。如果您不能使用它,请在$uri返回文档($uri)
中对$uri使用
,而不是
$uri!另一个解决方案是在Java应用程序中实现CollectionURIResolver。在运行转换之前,您可以将其指定给Saxon。调用collection()函数时,Saxon将调用CollectionURIResolver,它可以传回文档或URI列表


谢谢弗洛伦特的回答。。。因此,如果我通过名为URI的Java代码提供一个参数,这是一个以逗号分隔的URI列表,那么使用它如何知道如何将URI解析为不同的文件呢?对不起,我的XSLT知识非常基础:(为什么您希望它是要分析的字符串?您不传递字符串序列是什么?如果现在的问题是如何使用API“xyz”(例如Saxon S9API)将字符串序列传递给参数),我将开始一个新问题。我认为答案应该指出,
运算符是XPath 3.0的一部分,因此即使使用Saxon,它也仅在Saxon 9.6和
version=“3.0”中可用
stylesheet.Florent,我不知道文件列表有多长,这取决于之前在Java代码中所做的工作。基本上,我想从Java代码中为XSLT文件提供一个参数。但是由于文件列表可能有1或100个文件长,我需要解析它不?我不认为这是一个单独的问题,though我确实编辑了标题以删除其中的Java,因此我可能会将其添加回…我的样式表版本是2.0。请注意,您可以使用
而不是
,这应该会更有效,因为它在代码创建解析文档副本时加载和解析文档一次。嗨,Michael,谢谢您的回答。这很有效完美。创建了一个CollectionURIResolver,它接收文件列表并将其转换为通过resolve方法返回的AnyURIValue对象列表。
<xsl:param name="uris" as="xs:string+"/>
<xsl:param name="docs" select="$uris ! doc(.)"/>
<xsl:param name="uris" as="xs:string+"/>
<xsl:param name="docs" select="$uris ! collection(.)"/>
<xsl:param name="uris"  as="xs:string*"/>
<xsl:param name="colls" as="xs:string*"/>
<xsl:param name="docs"  as="document-node()*"/>

<xsl:variable name="my-docs" select="
   $uris ! doc(.), $colls ! collection(.), $docs"/>