将字符串与xslt进行比较并求和相同的

时间:2016-02-27 02:54:57

标签: xml xslt

我有这个xml

<home>
<room name="Petter">
    <surface>200</surface>
</room>
<room name="Sara">
    <surface>50</surface>
</room>
<room name="Petter">
    <surface>100</surface>
</room>

使用xslt:

我如何解决这个问题:我必须总结属于Petter的所有表面元素并且属于Sara(动态)。即彼得= 300,萨拉= 50

我必须比较@name并将具有相等@name的曲面相加,但我不知道该怎么做。

1 个答案:

答案 0 :(得分:0)

以下是使用XSLT1解决问题的一种方法。

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">

    <xsl:output method="text"/>

    <xsl:template match="/">
        <xsl:for-each select="/home/room[not(@name=preceding-sibling::room/@name)]">
            <xsl:value-of select="@name"/>
            <xsl:text>: </xsl:text>
            <xsl:value-of select="sum(../room[@name=current()/@name])"/>
            <xsl:text>&#xA;</xsl:text>
        </xsl:for-each>
    </xsl:template>

</xsl:stylesheet>

我们遍历每个房间,其名称尚未发生(每个房间的第一次出现),以获得唯一的名称列表。对于这样的房间,我们总结名称等于我们正在使用的名称的房间。这将输出

Petter: 300
Sara: 50

还有其他方法可以执行此分组,例如 The Muenchian Method ,它依赖于 xsl:key 以及key和{ {1}}函数并且通常比此方法更有效。如果您希望使用该方法,我会将其作为练习。但是,我不确定它在这个用例中是否更有效。

使用XSLT2,我们可以这样做

generate-id

这里我们也循环了房间元素,但我们可以告诉XSLT引擎按名称为它们分组。然后,对于每个组,我们输出名称和组的总和