fn:transform 使用默认调用模板调用运行 - 未创建结果文档

问题描述

此转换 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 上运行

解决方法

fn:transform function 不向文件系统写入任何内容,它返回一个带有

的映射

映射中的一个条目用于主要结果文档,一个用于 每个辅助结果文档。密钥是一个 URI,其形式为 xs:字符串值。主要结果文件的关键是基础 如果指定,则为输出 URI,否则为字符串“输出”。的关键 次要结果文档是文档的 URI,作为绝对值 URI。每个条目中的关联值取决于请求的 交付格式。如果交付格式为文档,则值为 文档节点。如果传递格式是序列化的,则值为 包含序列化结果的字符串

如果要将结果文档写入文件系统,则需要在处理 transform 函数返回的地图的代码中执行此操作,例如使用 fn:put 或 EXPath {{1} } 模块。

file 函数的选项映射也有一个钩子 transform

用于对每个结果文档进行后处理的函数 转换(主要结果和次要结果),在 以其他方式交付的任何形式(文档、序列化、 或生)。该函数的第一个参数是用于 通过 fn:transform 函数识别 map 返回的结果 (例如,在以下情况下,这将是提供的基本输出 URI 主要结果,如果没有基本输出 URI,则为字符串“输出” 提供)。第二个参数是实际值。价值是 在 fn:transform 函数的结果中返回的是 应用此后处理。

请注意,Saxonica 的开源家庭版不提供 post-process 和 EXPath 文件模块;不过,GitHub 上有第三方 fn:put 模块实现:https://github.com/Armatiek/saxon-extensions

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...