首页 > 解决方案 > 有没有办法在 XSLT 样式表中有一个 Xquery,它将在转换时执行?

问题描述

我有一个 XML 文件,我一直在尝试同时使用 xQuery 和 XSLT 进行转换。

该文档基本上根据 TEI 标准对两种不同类型的文本进行编码。第一部分是我写的关于史诗的文献学研究,第二部分是这首诗的学术版。

<text>
<front><!-- chapters of the study --></front>
<body>
<lg n="1">
<l n="1.a">first line of the poem</l>
<l n="1.a">second line with <distinct>interesting stuff</distinct></l></lg>
<!-- rest of the poem-->
</body></text>

我的主要目标是使用 XSLT 将其转换为格式良好的 html 文档,并且在大多数情况下它可以工作。现在,该研究讨论了该版本的数据(“这个有趣的东西经常出现在我们的诗中,如下表所示”)。由于标记了所有“有趣的东西”(参见上面的示例),我可以使用 HTML 和 xQuery 的组合轻松创建这些表:

<table>
<tr>
<td>Verse Number</td>
<td>Interesting Stuff</td>
<tr>
for $case in doc("mydocument.xml")//distinct
return
<tr>
<td>{data($case/ancestor::l/@n)}</td>
<td>$case</td></tr></table>

目前最简单的方法是更改​​ xQuery,使其创建符合 TEI 的 xml 表并将其手动复制到文档中。然后,XSLT 将顺利运行,就像它对我拥有的几个静态表一样。但是我的大多数表格应该是动态的,如果我在版本中更改某些内容,我希望数字会改变。每次新阅读器在浏览器中打开格式化文本时(即每次执行 XSLT 转换)都应该这样做。

我尝试组合代码如下:

<xsl:template match="table[type='query']">
{ (: the xQuery-html instructions from above go here :) }
</xsl template>

我在正确的位置创建了一个表,但在它之前和单元格中它只是重复 xQuery 指令。我一直在寻找类似的问题,但我只找到了相反的过程,即如何使用 xQuery 创建 XSLT(例如:从 XSLT 调用 XQuery,在 XQuery 中动态构建 XSLT?),这对我的问题没有帮助。

有没有办法结合这两个代码?

在此先感谢您的帮助!

标签: htmlxmlxsltxquerytei

解决方案


有多种方法可以组合 XSLT 和 XQuery。您可以在同一管道中拥有 XSLT 任务和 XQuery 任务,或者您可以从 XSLT 调用 XQuery 函数(例如在 XSLT 3.0 中使用 load-xquery-module())。但是对于您所描述的情况,最简单的方法是将 FLWOR 表达式替换为等效的 xsl:for each:

<xsl:for-each select='doc("mydocument.xml")//distinct'>
  <xsl:variable name="case" select="."/>
  <tr>
    <td>{$case/ancestor::l/@n}</td>
    <td>{$case}</td>
  </tr>
</xsl:for-each>

注意:XSLT 3.0 允许使用花括号语法(您需要指定 expand-text="yes"),但语义与 XQuery 略有不同——它的意思是“value-of”而不是“copy-of”。


推荐阅读