使用 xi:include 导入 XQuery 结果为 XML 文档

Import XQuery results in an XML document using xi:include

是否可以使用 xi:include 导入外部 xquery 文档的结果或从 xml 文档中调用 xquery?我知道这并不是真正的目的,但我遇到了使用 xslt 创建和设置一系列 xml 文档的情况。我想从 xml 文档中抓取一小部分(来自一首诗的多个版本的一行)并将其显示在页面底部。我的 xquery 有效,但我正在尝试弄清楚如何最好地处理下一步。

这个 xquery:

let $q:=collection('file:/users/matt/Documents/tei/Lydgate/Quis_Dabit?select=*.xml')

for $y in $q//tei:surface

let $g := concat(substring($y/tei:graphic/@url,1,string-length($y/tei:graphic/@url)-4), '.html')
let $z := $y/tei:zone[@n="EETS.QD.4"]
let $l := $z/tei:line[@n="l.1"]
let $o := $l/tei:orig/node()
where ($z//tei:line/@n = "l.1")


return <item><ref target="{$g}">{$o}</ref></item>

`抓取所有 xml 文档并生成此结果:

<item>
   <ref target="British_Library_Harley_2255_f67r.html">
      <hi xmlns="http://www.tei-c.org/ns/1.0" rend="blue_pilcrow">¶</hi>O alle ye douħtren of <hi xmlns="http://www.tei-c.org/ns/1.0" rend="underline">ierusaleem</hi>
   </ref>
</item>
<item>
   <ref target="Jesus_Q_G_8_f20r.html">
      <hi xmlns="http://www.tei-c.org/ns/1.0">A</hi>ll the <hi xmlns="http://www.tei-c.org/ns/1.0" rend="underline">doughtren </hi>of <hi xmlns="http://www.tei-c.org/ns/1.0" rend="underline">Ier</hi>
      <hi xmlns="http://www.tei-c.org/ns/1.0" rend="underline">usa</hi>
      <hi xmlns="http://www.tei-c.org/ns/1.0" rend="underline">l</hi>
      <hi xmlns="http://www.tei-c.org/ns/1.0" rend="underline">e</hi>
      <hi xmlns="http://www.tei-c.org/ns/1.0" rend="underline">m</hi> .</ref>
</item>
<item>
   <ref target="Laud_683_f78v.html">O alle ẏe douhtren of jerusaleem</ref>
</item>

因为我在那里有 xsl 结构,所以我想使用与静态 xml 页面相同的 xsl 表来设计它的样式。这意味着我希望能够做这样的事情:

<TEI xmlns="http://www.tei-c.org/ns/1.0" version="5.0" xmlns:xi="http://www.w3.org/2001/XInclude"> 
<teiHeader>
    <fileDesc>
        <titleStmt>
            <title/>
        </titleStmt>
        <publicationStmt>
            <p/>>
        </publicationStmt>
        <sourceDesc>
            <p/>
        </sourceDesc>
    </fileDesc>
</teiHeader>
<text>
    <body>
        <list>
            <xi:include href="test.xq"/>
        </list>
    </body>
</text>

我的 xsl 样式表声明在顶部。我知道如果我将所有内容都放入 eXist 数据库中是可能的,但如果我能提供帮助的话,我真的宁愿不为了这次搜索而添加整个平台。另外,如果我在咆哮完全错误的树,如果有人能告诉我,我将不胜感激。

让我们从头说起:XML 本身什么都不知道,所以要回答您的第一个问题,您是否可以通过仅在 XML不可能。

存在解决方法但并非微不足道:

  • 创建一个外部解析的实体
  • 向您的 XML Reader 实体注册Reader(名称可能因平台而异)
  • 此 reader 处理实体,即它运行 XQuery
  • 它returns 这个 XQuery 的结果,然后可以显示。

这种方法意味着您的 XML 只有在使用实体 Reader 读取时才能正确显示(您甚至可以放弃实体 reader 并简单地使用 register an XInclude URIResolver,可能更简单,但效果是一样的)。

如果您的要求只是包含 XQuery 脚本,但不执行它,那么您已经显示了正确的分辨率,所以我猜这不是您想要的。

既然您提到您使用 XSLT 解析文档,那么还有另一种解决方案,假设您上面显示的 XML 是由 XSLT 生成的。在XSLT 3.0, you can import a package from XQuery. This is a (very) new feature and I'm sure we don't already support it in Exselt (and we aren't planning so in the near future), but Saxon可能。

但是,如果采用这种方式,您可以将 XQuery 重写为 XSLT(假设您的基础架构允许这样做)并且您将拥有更简单的实施策略。

最后一个想法:如果您的 XQuery 是静态的,也就是说,如果它总是 returns 相同,则应该没有必要包含 XQuery。但是,如果您的要求是使您的 XML 是动态的,那么 EntityReader 或 URIResolver 是可行的方法,但本质上,XML 本身并不意味着是动态的,但它可以作为下一个过程的输入。