2011-03-03 47 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方法實現分組。

相關問題