有没有办法在转换时执行的 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(例如:calling XQuery from XSLT,building XSLT dynamically in XQuery?),这对我的问题没有帮助。

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

预先感谢您的帮助!

解决方法

有多种方法可以组合 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”。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...