是否有方法获取上一次迭代的元素。
我有以下XML文档(为了更好地概述,缩写):
<requests>
<request>
<id>514</id>
<status>accepted</status>
<updated>"2013-10-07T12:00:51.508"</updated>
<query>
<![CDATA[Select column1 from table1]]>
</query>
</request>
<request>
<id>22</id>
<status>rejected</status>
<updated>"2012-11-07T12:00:51.508"</updated>
<query>
<![CDATA[Select column3 from table2]]>
</query>
</request>
<request>
<id>7523</id>
<status>accepted</status>
<updated>"2012-01-07T02:00:52.508"</updated>
<query>
<![CDATA[Select column8 from table3]]>
</query>
</request>
<request>
<id>84</id>
<status>accepted</status>
<updated>"2000-12-07T12:00:51.1"</updated>
<query>
<![CDATA[Select column1 from table1]]>
</query>
</request>
<request>
<id>999</id>
<status>accepted</status>
<updated>"2006-12-07T12:00:51.1"</updated>
<query>
<![CDATA[Select column1 from table1]]>
</query>
</request>
.
.
.
</requests>
现在,我必须选择状态为"accepted"的所有节点,按表分组,然后按查询的列分组,每列只选择两个更新时间最近的请求。输出应该是以简单文本形式给出的这些节点的id。例如,对于查询"从表1中选择列1",应该选择514和999进行输出,而不是84。我读过muenchian方法,但我无法将其应用于已解析的文本(在本例中为查询中的文本)。这就是为什么我试图找出从以前的迭代中获得信息的方法,这样我就可以根据给定的标准对节点进行排序,并找到我要查找的id。
例如:
<xsl:for-each select="*[local-name()='requests']/*[local-name='request'][@status='accepted']" >
<xsl:sort select="string(*[local-name()='query']/text())" order="text" data-type="number" />
<xsl:sort select="@pdated" order="descending" data-type="number" />
<xsl:value-of select="string(preceding-sibling::*[1]/*[local-name()='query']/text()) />
现在这是可行的,但不是我想要的方式,它返回文档中的前一个同级,而不是上一次迭代的查询文本。这样的事情可能发生吗?感谢
XSLT是一种声明性语言,虽然for-each
看起来像是一个过程for
循环,但在XSLT1.0或2.0规范中没有这方面的概念。因此previous iteration
的概念也不存在。只有带有xsl:iterate
的XSLT3.0提供了类似的功能,可以在不将整个文档树加载到内存中的情况下处理非常大的文档。
对于XSLT1.0,您需要使用不同的方法,您需要发布要处理的输入样本的结构和要创建的相应结果,以便我们能够帮助编写具体的代码。
我读过关于muenchian方法的文章,但我无法将其应用于解析后的文本(在本例中为查询中的文本)。
这就是如何根据解析的文本应用Muenchian分组的方法——在本例中,列名称:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:key name="req" match="request[status='accepted']" use="substring-before(substring-after(query ,'Select '), ' from')" />
<xsl:template match="/">
<root>
<xsl:for-each select="requests/request[status='accepted'][count(. | key('req', substring-before(substring-after(query ,'Select '), ' from'))[1]) = 1]">
<group>
<xsl:value-of select="query"/>
</group>
</xsl:for-each>
</root>
</xsl:template>
</xsl:stylesheet>
应用于您的示例输入,这将导致:
<?xml version="1.0" encoding="UTF-8"?>
<root>
<group>Select column1 from table1</group>
<group>Select column8 from table3</group>
</root>
现在,您只需要按更新时间对组成员进行排序,并输出前两个。