XSL获取选择的最后一个节点

时间:2011-03-03 13:11:28

标签: xml xslt

我有以下包含图像数据的xml文件:

<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 并将其作为结果呈现,在这个例子中它将是:
aid = 1,imid = 3,src = img3.jpg
aid = 2,imid = 2,src = img2.jpg

(在原始文件中,援助可以包含大量 imid

以下xsl选择将仅提供完整选择所有图像的最后一张图像。

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

以下xsl选择为我提供了援助中每个第一个 imid 的结果。

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

我如何调整该代码,因此它只会给我每个援助的最后 imid

3 个答案:

答案 0 :(得分: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>

答案 1 :(得分: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"/>

答案 2 :(得分: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文档(包含在顶层元素中,格式正确):

<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方法实现分组。