如何在xslt中选择仅第一个节点

9

我的XML文件为我提供了多个与不同MMID相关联的图像:

<Mediendaten>
    <Mediendaten mmid="22404">
        <url size="original">A 22404 FILE</url>
        <url size="thumb">ANOTHER 22404 FILE</url>
    </Mediendaten>
    <Mediendaten mmid="22405">
        <url size="original">A 22405 FILE</url>
        <url size="thumb">ANOTHER 22405 FILE</url>
    </Mediendaten>
<Mediendaten>

我的XSLT仅选择size=thumb的URL:
<xsl:template match="/Mediendaten">
<xsl:apply-templates select="Mediendaten/url">
</xsl:apply-templates>
</xsl:template>

<xsl:template match="Mediendaten/url">
<xsl:if test="@size = 'thumb'">
<img width="280" border="0" align="left">
<xsl:attribute name="src"><xsl:value-of select="."/></xsl:attribute>
</img>
</xsl:if>
</xsl:template>

然而,我只需要第一个mmid(在本例中为22404)的缩略图。我无法控制mmid值。

我该如何停止模板,以便仅输出第一个mmid的缩略图文件?

非常感谢您的帮助!


不要在模板内部使用 <xsl:if>,而是可以将该条件放在模板匹配中:<xsl:template match="Mediendaten/url[@size]">。这样可以让 XSLT 处理器有机会进行优化,并简化样式表。 - Mads Hansen
3个回答

14

最简单的方法是更改/Mediendaten的模板:

<xsl:template match="/Mediendaten">
  <xsl:apply-templates select="Mediendaten[@mmid][1]/url"/>
</xsl:template>

[@mmid]限制了只选择带有mmid属性的子Mediendaten元素,[1]将选择限制为这些元素中的第一个。

附言:设计你所使用的XML的人讨厌你。(现在标记为Mediendaten的两种类型的元素使用相同的名称是一种肮脏的把戏;它使得对数据进行的所有操作都更加困难。尝试弄清楚你做了什么让他们如此生气,并与他们和解。这只是一个聪明人的提示。)


1
非常好的回答。谢谢。完美地解决了问题。你说得没错:XML确实很具有挑战性……我们将送他们鲜花和一瓶好酒;) - Richard Tinkler
1
@RichardTinkler 你有把它发送给他们吗? - kgui

1
<xsl:apply-templates select="Mediendaten[1]/url" />

1

一些建议。

首先,按照Mads Hansen的建议进行操作。拥有一个模板,了解如何处理“缩略图”图像。

<xsl:template match="Mediendaten/url[@size = 'thumb']" >
    <img width="280" border="0" align="left" src="{.}" />
</xsl:template>

如果您只想输出第一个缩略图(从Mediendaten中按文档顺序),请使用以下代码:
<xsl:template match="/Mediendaten">
    <xsl:apply-templates select="Mediendaten[1]/url[@size = 'thumb']" />
</xsl:template>

但是,如果
"HOWEVER, I only need the thumbnail from the first mmid" 的意思不是按文档顺序获取Mediendaten(具有mmid),而是从具有最小mmid的Mediendaten开始。请尝试以下操作:

<xsl:template match="/Mediendaten">
    <xsl:for-each select="Mediendaten">
        <xsl:sort select="@mmid"/>
        <xsl:if test="position()=1">
            <xsl:apply-templates select="url[@size = 'thumb']" />
        </xsl:if>
    </xsl:for-each>
</xsl:template>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接