匹配多个重复节点,然后添加其输出

时间:2013-09-14 13:57:21

标签: xml xslt highcharts xslt-1.0

我有传入的xml,如

<?xml version="1.0" encoding="UTF-8"?>
<RootName>
    <RandomRootNode>
        <RandomNode>
            <Identity>1</Identity>
            <Name>abc</Name>
        </RandomNode>
        <RandomNode>
            <Identity>2</Identity>
            <Name>def</Name>
        </RandomNode>
        <RandomNode>
            <Identity>3</Identity>
            <Name>ghi</Name>
        </RandomNode>
    </RandomRootNode>
    <SeriesRootNode>
        <Series>
            <Identity>2</Identity>
            <Total>25</Total>
        </Series>
        <Series>
            <Identity>3</Identity>
            <Total>25</Total>
        </Series>
        <Series>
            <Identity>2</Identity>
            <Total>20</Total>
        </Series>
    </SeriesRootNode>
</RootName>

我的输出xml有一个元素<sum>,将使用xslt按照以下规则填充

  1. 首先找到<Identity><RandomNode>节点中<Series>的所有匹配值
  2. 如果存在则将<Total>
  3. 加起来

    按照上面的例子 -

    <output>
        <ResultSet>
            <Identity>2</Identity>
            <sum>45</sum>
            <Identity>3</Identity>
            <sum>25</sum>
        </ResultSet>
    </output>
    

    如果有人知道如何实现它,请告诉我。

2 个答案:

答案 0 :(得分:0)

请看下面的xslt,它给出了你期望的输出

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>

    <xsl:template match="/">
        <output>
            <ResultSet>
                <!-- Apply template for RandomNode fulfiling condition that its Identity can be found within any Series element-->
                <xsl:apply-templates select="RootName/RandomRootNode/RandomNode[Identity = /RootName/SeriesRootNode/Series/Identity]" />
            </ResultSet>
        </output>
    </xsl:template>

    <xsl:template match="RandomNode">
        <Identity>
            <xsl:value-of select="Identity" />
        </Identity>
        <Sum>
            <!-- Sum values of Total elements that has Identity equal to the Identity of current RandomNode -->
            <xsl:value-of select="sum(/RootName/SeriesRootNode/Series[Identity = current()/Identity]/Total)" />
        </Sum>
    </xsl:template>

</xsl:stylesheet>

<?xml version="1.0" encoding="UTF-8"?>
<output>
    <ResultSet>
        <Identity>2</Identity>
        <Sum>45</Sum>
        <Identity>3</Identity>
        <Sum>25</Sum>
    </ResultSet>
</output>

答案 1 :(得分:0)

这是一种使用密钥的简洁而有效的方法:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/>
  <xsl:key name="kSeries" match="Series/Total" use="../Identity" />

  <xsl:template match="/*">
    <output>
      <ResultSet>
        <xsl:apply-templates
          select="RandomRootNode/RandomNode/Identity[key('kSeries', .)]" />
      </ResultSet>
    </output>
  </xsl:template>

  <xsl:template match="Identity">
    <Identity>
      <xsl:value-of select="."/>
    </Identity>
    <sum>
      <xsl:value-of select="sum(key('kSeries', .))" />
    </sum>
  </xsl:template>
</xsl:stylesheet>

在样本输入上运行时,结果为:

<output>
  <ResultSet>
    <Identity>2</Identity>
    <sum>45</sum>
    <Identity>3</Identity>
    <sum>25</sum>
  </ResultSet>
</output>