2011-03-03 97 views
1

我有一个包含图像数据下面的XML文件:XSL获得一个选择的最后一个节点

<images> 
<aid>1</aid> 
    <imid>1</imid> 
    <src>img1.jpg</src> 
</images> 
<images> 
<aid>1</aid> 
    <imid>2</imid> 
    <src>img2.jpg</src> 
</images> 
<images> 
<aid>1</aid> 
    <imid>3</imid> 
    <src>img3.jpg</src> 
</images> 
<images> 
<aid>2</aid> 
    <imid>1</imid> 
    <src>img1.jpg</src> 
</images> 
<images> 
<aid>2</aid> 
    <imid>2</imid> 
    <src>img2.jpg</src> 
</images> 
<images> 
etc... 

我想从各个援助只有最后IMID 获取并将其显示结果,在本例情况下,其将是:
援助= 1和酰亚胺= 3和src = img3.jpg
援助= 2和酰亚胺= 2和src = img2.jpg

(在原来的文件,援助可以包含很多IMID的的)

以下XSL选择会给我从所有图像的完整选择只有最后一张图像。

<xsl:for-each select="(/images[aid&gt;=1 and imid])[last()]"> 

以下XSL选择给我的援助每月的第一个酰亚胺的结果。

<xsl:for-each select="(/images[aid&gt;=1 and imid=1])"> 

我怎样才能调整的代码,所以它会给我只有每援助最后酰亚胺

+0

你说你想要每个'aid'的最后一个'imid',但这不是你的源XML的形成方式。你可能想再看看你的输入或修改你的例子。 – 2011-03-03 15:26:28

+0

好问题,+1。查看我的答案,获得完整,简短且容易的XSLT 1.0解决方案。 :) – 2011-03-03 16:46:13

回答

0

假设你使用XSLT 2.0,

<xsl:for-each-group select="//images" group-by="aid"> 
    <xsl:variable name="last" select="current-group()[last()]"/> 
    <out aid="{$last/aid}" imid="{$last/imid}" src="{$last/src}"/> 
</xsl:for-each-group> 
+0

+1正确答案:为每个组选择最后一个。 – 2011-03-03 16:35:07

0

在XSLT 1.0:

<xsl:key name="kImagesByAid" match="images" use="aid"> 
<xsl:variable name="vLastImids" 
    select="/*/images[count(.|key('kImageByAid',aid)[last()])=1]/imid"/> 
0

这XSLT 1.0转化:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 
<xsl:strip-space elements="*"/> 

<xsl:key name="kImgByAid" match="images" use="aid"/> 

<xsl:template match="node()|@*"> 
    <xsl:copy> 
    <xsl:apply-templates select="node()|@*"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match= 
    "images[not(generate-id() 
      =generate-id(key('kImgByAid',aid)[last()]) 
      ) 
      ]"/> 
</xsl:stylesheet> 

当所提供的XML应用文件(wrapp编在顶部元件被很好形成的):

<gallery> 
    <images> 
     <aid>1</aid> 
     <imid>1</imid> 
     <src>img1.jpg</src> 
    </images> 
    <images> 
     <aid>1</aid> 
     <imid>2</imid> 
     <src>img2.jpg</src> 
    </images> 
    <images> 
     <aid>1</aid> 
     <imid>3</imid> 
     <src>img3.jpg</src> 
    </images> 
    <images> 
     <aid>2</aid> 
     <imid>1</imid> 
     <src>img1.jpg</src> 
    </images> 
    <images> 
     <aid>2</aid> 
     <imid>2</imid> 
     <src>img2.jpg</src> 
    </images> 
</gallery> 

产生想要的,正确的结果:

<gallery> 
    <images> 
    <aid>1</aid> 
    <imid>3</imid> 
    <src>img3.jpg</src> 
    </images> 
    <images> 
    <aid>2</aid> 
    <imid>2</imid> 
    <src>img2.jpg</src> 
    </images> 
</gallery> 

说明

  1. 身份规则(模板)“按原样”复制每个节点。

  2. 有一个ovverriding模板,排除不是组中最后一个的任何images元素。

  3. 使用经典的Muenchian方法实现分组。

相关问题