有没有办法在转换时执行的 XSLT 样式表中包含 Xquery?
Is there a way to have an Xquery in an XSLT stylesheet which will be executed upon transformation?
我有一个 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 文档,并且在大多数情况下都能正常工作。
现在,该研究讨论了版本中的数据(“这种有趣的东西经常出现在我们的诗中,如下面 table 所示”)。由于所有“有趣的东西”都被标记了(见上面的示例),我可以使用 HTML 和 xQuery:
的组合轻松创建那些 tables
<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-conform xml table 并将其手动复制到文档中。然后,XSLT 将顺利运行,就像我拥有的几个静态 table 一样。但是我的大多数 table 应该是动态的,如果我在版本中更改某些内容,我希望数字会发生变化。每次新 reader 在浏览器中打开格式化文本时(即每次执行 XSLT 转换时)都应该这样做。
我尝试组合代码如下:
<xsl:template match="table[type='query']">
{ (: the xQuery-html instructions from above go here :) }
</xsl template>
我在正确的位置创建了一个 table,但在它之前和单元格中它只是重复 xQuery 指令。我一直在寻找类似的问题,但我只找到了相反的过程,即如何使用 xQuery 创建 XSLT(例如:),这对我的问题没有帮助。
有没有办法合并这两个代码?
在此先感谢您的帮助!
您可以通过多种方式组合 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 略有不同 - 它表示“值”而不是“副本” ".
我有一个 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 文档,并且在大多数情况下都能正常工作。 现在,该研究讨论了版本中的数据(“这种有趣的东西经常出现在我们的诗中,如下面 table 所示”)。由于所有“有趣的东西”都被标记了(见上面的示例),我可以使用 HTML 和 xQuery:
的组合轻松创建那些 tables<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-conform xml table 并将其手动复制到文档中。然后,XSLT 将顺利运行,就像我拥有的几个静态 table 一样。但是我的大多数 table 应该是动态的,如果我在版本中更改某些内容,我希望数字会发生变化。每次新 reader 在浏览器中打开格式化文本时(即每次执行 XSLT 转换时)都应该这样做。
我尝试组合代码如下:
<xsl:template match="table[type='query']">
{ (: the xQuery-html instructions from above go here :) }
</xsl template>
我在正确的位置创建了一个 table,但在它之前和单元格中它只是重复 xQuery 指令。我一直在寻找类似的问题,但我只找到了相反的过程,即如何使用 xQuery 创建 XSLT(例如:
有没有办法合并这两个代码?
在此先感谢您的帮助!
您可以通过多种方式组合 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 略有不同 - 它表示“值”而不是“副本” ".