使用xi:include

时间:2015-09-03 07:52:19

标签: xml xslt xquery exist-db

是否可以使用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数据库是可能的,但我真的不想仅仅为了这个搜索而添加整个平台,如果我能帮助它的话。此外,如果我咆哮完全错误的树,我也会感激,如果有人能让我知道的话。

1 个答案:

答案 0 :(得分:2)

让我们从头开始:XML本身并不知道任何事情,所以要回答你的第一个问题,你是否可以通过在XML中引用它来包含(并执行,我假设!)XQuery查询可能的。

存在一种解决方法,但并非易事:

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

这种方法意味着只有在使用EntityReader读取XML时才能正确显示XML(您甚至可以放弃实体读取器,只需使用寄存器XInclude URIResolver,可能更简单,但效果相同)。

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

由于您提到使用XSLT解析文档,因此还有另一种解决方案,假设您显示的XML是由XSLT生成的。在XSLT 3.0, you can import a package from XQuery。这是一个(非常)新功能,我确信我们不会在Exselt中支持它(我们在不久的将来也不会这样做),但是{{3可能。

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

最后一个想法:如果你的XQuery是静态的,也就是说,如果它总是返回相同的,那么就不需要包含XQuery了。但是,如果您的要求是使您的XML成为动态,那么EntityReader或URIResolver就是可行的方法,但实质上,XML本身并不是动态的,但它可以作为下一个进程的输入。