XSLT:如何访问以前的组

时间:2015-04-29 17:30:55

标签: xml xslt

我正在编写一段代码,任何帮助都会受到赞赏。

为了简化故事,在我的XSLT(2.0)文件中,我有2个嵌套循环。 第一个基于年份值执行分组。 对于这些组中的每一个,内部循环执行一些操作。在这个特定的循环中,当在当前组中执行任务时,我需要知道前一组的大小(元素的数量)。 当然,我无法弄清楚如何实现这一目标。

这是一段XSLT代码:

<xsl:for-each-group select=" ... " group-by="year">


        <xsl:for-each select="current-group()">

            <!-- Here I want to know the number of elements of previous group -->

        </xsl:for-each>
 </xsl:for-each-group>

对于第一组,当然大小必须为0,因为还没有以前的组。 对于下一组(第二,第三,......),我需要知道前一组的元素数量。

例如,如果我们有两组:

  • 2007年组元素data1 data2 data3 data4
  • 2009年组元素data5 data6

当内循环在&#39; 2009 group&#39;上执行操作时,我需要知道2007组有4个元素。 (data1 data2 data3 data4)

更多细节!

以下是我的XML文件的外观。你有一个名为“dblp&#39;”的root racine,你可以在其中找到&#39;诉讼程序&#39;或者&#39; inproceedings&#39;标签。其中每一项都包含对出版物的描述,标题为年份,作者/编辑,.......

<dblp>
<proceedings mdate="2007-08-28" key="conf/adma/2007">
    <editor>Reda Alhajj</editor>
    <editor>Hong Gao</editor>
    <editor>Xue Li</editor>
    <editor>Jianzhong Li</editor>
    <editor>Osmar R. Zaïane</editor>
    <title>Advanced Data Mining and Applications, Third International Conference, ADMA 2007, Harbin, China, August 6-8, 2007, Proceedings</title>
    <booktitle>ADMA</booktitle>
    <series href="db/journals/lncs.html">Lecture Notes in Computer Science</series>
    <volume>4632</volume>
    <publisher>Springer</publisher>
    <year>2009</year>
    <isbn>978-3-540-73870-1</isbn>
    <url>db/conf/adma/adma2007.html</url>
</proceedings>
<proceedings mdate="2007-08-28" key="conf/adma/2007">
    <editor>Reda Alhajj</editor>
    <editor>Hong Gao</editor>
    <editor>Xue Li</editor>
    <editor>Jianzhong Li</editor>
    <editor>Osmar R. Zaïane</editor>
    <title>Advanced Data Mining and Applications, Third International Conference, ADMA 2007, Harbin, China, August 6-8, 2007, Proceedings</title>
    <booktitle>ADMA</booktitle>
    <series href="db/journals/lncs.html">Lecture Notes in Computer Science</series>
    <volume>4632</volume>
    <publisher>Springer</publisher>
    <year>1999</year>
    <isbn>978-3-540-73870-1</isbn>
    <url>db/conf/adma/adma2007.html</url>
</proceedings>
<inproceedings mdate="2007-08-28" key="conf/adma/YangLH07">
    <author>Hui Yang</author>
    <author>Reda Alhajj</author>
    <author>Hongyan Liu</author>
    <author>Jun He</author>
    <title>DELAY : A Lazy Approach for Mining Frequent Patterns over High Speed Data Streams.</title>
    <pages>2-14</pages>
    <year>2009</year>
    <crossref>conf/adma/2007</crossref>
    <booktitle>ADMA</booktitle>
    <ee>http://dx.doi.org/10.1007/978-3-540-73871-8_2</ee>
    <url>db/conf/adma/adma2007.html#YangLH07</url>
</inproceedings>
<inproceedings mdate="2007-11-29" key="conf/adma/GuoKG07">
    <author>Yi Guo</author>
    <author>Reda Alhajj</author>
    <author>Paul Wing Hing Kwan</author>
    <author>Junbin Gao</author>
    <title>Learning Optimal Kernel from Distance Metric in Twin Kernel Embedding for Dimensionality Reduction and Visualization of Fingerprints.</title>
    <pages>227-238</pages>
    <year>2007</year>
    <crossref>conf/adma/2007</crossref>
    <booktitle>ADMA</booktitle>
    <ee>http://dx.doi.org/10.1007/978-3-540-73871-8_22</ee>
    <url>db/conf/adma/adma2007.html#GuoKG07</url>
</inproceedings>

这是我以前的XSLT代码:

<xsl:for-each-group select="/dblp/*/editor[text() = $currentEditor] | /dblp/*/author[text() = $currentEditor]" group-by="../year">
     <xsl:value-of select="current-grouping-key()"/>
     <xsl:for-each select="current-group()">
         <xsl:variable name="titre" select="(../title)"/>
         <xsl:variable name="linkEE" select="(../ee)"/>
     </xsl:for-each>
</xsl:for-each-group>

&#34; xsl:for-each-group&#34;根据出版物的年度价值(会议记录,报告)进行分组。如你所见,我选择了 特定的编辑或作者。例如,$ currentEditor可以是Reda Alhajj&#39;。 对于Reda Alhajj&#39;它将创建3个小组:2009年小组(1个程序+ 1个参与者),2007年小组(1个进行中)和1999年小组(1个程序) (正如您在XML文件中看到的那样) 然后,内部循环将遍历每个组的元素以检索更多信息(标题,链接,...)。

我的问题:如何使用新的xslt代码实现相同的行为?

<xsl:for-each select="$groups/group">
      how to get current-grouping-key ??
     <xsl:for-each select="*">  title ?? link ??</xsl:for-each>
</xsl:for-each>

非常感谢!

我重写了Martin Hoonen提供的代码,这是我目前的XSLT代码。

<xsl:variable name="groups">
<xsl:for-each-group select="/dblp/*/editor[text() = $currentEditor] | /dblp/*/author[text() = $currentEditor]" group-by="../year">
    <group  year="{../year}">
            <xsl:for-each select="current-group()">
                <elem  titre="{../title}" linkEE="{../ee}" editeurs="{../author | ../editor}">
                </elem>
            </xsl:for-each>
    </group>
</xsl:for-each-group>
</xsl:variable>


<xsl:for-each select="$groups/group">
     <xsl:value-of select="@year"/>

     <xsl:for-each select="elem">
          <xsl:variable name="person" select="@editeurs"/>
          <xsl:for-each select="$person">
               <!-- NOT WORKING TO LOOP SEPARATELY OVER EACH AUTHOR/EDITOR : gives me all author/editors of elem at the first iteration of loop -->
               <xsl:value-of select="."/>
          </xsl:for-each>
     </xsl:for-each>
 </xsl:for-each>

在变量&#34; groups&#34;中,我有一个标签&#34; group&#34;对应于一般组(按年份分类)。在这个&#34;组&#34;标签,我添加了一个&#34; elem&#34;对应于出版物的标签。根据契约,一个小组可以包含几个出版物(例如在2009年,有一个例如两个出版物,所以我有2&#34; elem&#34;在这个&#34; group&#34;,并且对于这些出版物中的每一个我保存标题,..)。

我的问题是作者/编辑。从XML文件中可以看出,我可以在一个出版物中有多个不同的作者或编辑器(例如在我的XML文件的第一个程序中,我有5个编辑器)。 我希望以后能够分别循环遍历它们。目前,我将它们保存为&#34; elem&#34;正如你所看到的那样,然后它们被保存为一个字符串,我无法分别循环遍历它们。 有没有人有想法实现这个目标?

目前,超过$ person的循环给了我这个结果: Hui Yang Reda Alhajj Hongyan Liu Jun He

代替(我可以进行特定处理的等值):

  • Hui Yang
  • Reda Alhajj
  • 刘红艳
  • Jun He

任何帮助表示赞赏! :)

0 个答案:

没有答案