【问题标题】:fn:transform running with default call-template invocation - no result-documents createdfn:transform 使用默认调用模板调用运行 - 未创建结果文档
【发布时间】: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 或 EXPath file 模块。 transform 函数有一个参数,您可以在其中挂钩一个函数来处理结果文档,从而使这些事情变得更容易一些。但 EXPath filefn:put 在开源家庭版中不可用。
  • 你想把这个作为你的答案,这样我才能接受。

标签: xslt xquery saxon


【解决方案1】:

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

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

如果您想将结果文档写入文件系统,您需要在处理 transform 函数返回的映射的代码中执行此操作,例如使用 fn:put 或 EXPath file 模块。

transform 函数的选项映射也有一个钩子post-process

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-06
    • 1970-01-01
    • 2021-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多