获取xslt 1.0中上一次迭代的元素



是否有方法获取上一次迭代的元素。

我有以下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>

现在,您只需要按更新时间对组成员进行排序,并输出前两个。

相关内容

  • 没有找到相关文章

最新更新