是否可以使用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数据库是可能的,但我真的不想仅仅为了这个搜索而添加整个平台,如果我能帮助它的话。此外,如果我咆哮完全错误的树,我也会感激,如果有人能让我知道的话。
答案 0 :(得分:2)
让我们从头开始:XML本身并不知道任何事情,所以要回答你的第一个问题,你是否可以通过在XML中引用它来包含(并执行,我假设!)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本身并不是动态的,但它可以作为下一个进程的输入。