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



是否可以使用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中引用它来包含(并执行!)XQuery查询是不可能的。

存在一个解决方案,但不是微不足道的:

  • 创建外部解析实体
  • 注册您的XML阅读器和EntityReader(名称可能因您的平台而异)
  • 阅读器处理实体,也就是说,它运行XQuery
  • 它返回这个XQuery的结果,然后可以显示。

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

如果您的要求只是包含XQuery脚本,但不执行它,那么您已经显示了正确的解析,因此我的猜测是这不是您所追求的。

既然您提到使用XSLT解析文档,那么还有另一个解决方案,假设您上面展示的XML是由XSLT生成的。在XSLT 3.0中,可以从XQuery导入包。这是一个(非常)新的特性,我确信我们还没有在Exselt中支持它(我们也不打算在不久的将来这样做),但是Saxon可能会。

但是,如果您这样做,您可以将XQuery重写为XSLT(假设您的基础结构允许这样做),并且您将拥有一个更简单的实现策略。

最后一个想法:如果XQuery是静态的,也就是说,如果它总是返回相同的结果,那么就不需要包含XQuery。但是,如果您的要求是使XML是动态的,则可以使用EntityReader或URIResolver,但实际上,XML本身并不意味着是动态的,但它可以作为下一个流程的输入。

最新更新