我有以下包含图像数据的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>=1 and imid])[last()]">
以下xsl选择为我提供了援助中每个第一个 imid 的结果。
<xsl:for-each select="(/images[aid>=1 and imid=1])">
我如何调整该代码,因此它只会给我每个援助的最后 imid ?
答案 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>
<强>解释强>:
身份规则(模板)按“原样”复制每个节点。
有一个ovverriding模板可以排除任何不属于其组中最后一个的images
元素。
使用经典的Muenchian方法实现分组。