【发布时间】:2021-02-11 17:34:43
【问题描述】:
这个转换 test.xsl 通过为每个递归遇到的 XML 文件调用一个标识转换来复制(为了一个小测试示例的目的)一个 XML 数据目录。
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:fn="http://www.w3.org/2005/xpath-functions"
xmlns:map="http://www.w3.org/2005/xpath-functions/map"
version="3.0" exclude-result-prefixes="xsi fn xs map" expand-text="yes">
<xsl:output method="xml" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:variable name="currentStylesheet" as="document-node()" select="doc('identity.xsl')"/>
<xsl:template name="xsl:initial-template">
<xsl:for-each select="collection('file:///mnt/c/home/oneD/data/translatable' || '?select=*.xml;recurse=yes')">
<xsl:result-document href="{replace(document-uri(),'/data/translatable/','/translated/')}">
<xsl:sequence select=" fn:transform(map {
'stylesheet-node' : $currentStylesheet,
'source-node' : .
})?output"/>
</xsl:result-document>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
但是,如果我像这样使用 fn:transform 从 XQuery 调用它
xquery version "3.1";
fn:transform(map { 'stylesheet-node' : doc('test.xsl')})?output
没有创建任何结果文档。
调用 XQuery 有什么问题吗?我以前从未尝试过,所以这是我阅读文档的最佳尝试。在 Saxon 10.3 上运行
【问题讨论】:
-
?output不应该为您提供主要结果和通过将结果 URI 作为参数传递给map:get可以找到的任何次要结果,例如let $result := transform(..) return $result('file://..../foo.xml')或通过输出$result?*获取所有结果? -
执行转换是为了在新目录中的文件系统上重新创建每个 XML 文件的副作用。我对 ?output 的内容不感兴趣,我只是把它放在那里以防止发生静态错误。从 fn:transform 调用时没有出现副作用 - 这是我的问题
-
transform函数不写入文件系统,它返回一个带有结果文档的映射,如果你想将它们写入文件系统,你需要在你的 XQuery 代码中这样做使用fn:put或 EXPathfile模块。transform函数有一个参数,您可以在其中挂钩一个函数来处理结果文档,从而使这些事情变得更容易一些。但 EXPathfile或fn:put在开源家庭版中不可用。 -
你想把这个作为你的答案,这样我才能接受。