我有一个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?),这无助于解决我的问题。
有办法把这两种代码结合起来吗?
提前感谢您的帮助!
发布于 2021-03-24 16:57:50
有多种方法可以组合XSLT和XQuery。可以将XSLT任务和XQuery任务放在同一个管道中,也可以从XSLT调用XQuery函数(例如,使用XSLT3.0中的())。但是对于您所描述的情况,最简单的方法是将FLWOR表达式替换为等效的xsl:。
<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>注意:XSLT3.0允许使用花括号语法(您需要指定展开-text=“yes”),但语义与XQuery (它的意思是"value-of“而不是"copy-of”)略有不同。
https://stackoverflow.com/questions/66782307
复制相似问题