微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。