XPATH:使用数组或disting从非唯一数据创建唯一数据列表

时间:2015-07-30 11:02:42

标签: arrays xml xslt xpath distinct

我有一个像这样的xml:

<Income>
    <Currency>USD</Currency>
    <Description>Bank Payment</Description>
    <Sum>300.82</Sum>
</Income>
<Income>
    <Currency>EUR</Currency>
    <Description>Bank Payment</Description>
    <Sum>100</Sum>
</Income>
<Income>
    <Currency>USD</Currency>
    <Description>Cash</Description>
    <Sum>500</Sum>
</Income>

我需要按货币对这些数据进行排序。可能有几个具有相同货币的区块,在这种情况下,我需要从那里拿出金额并将它们放到现有货币中。这是我想得到的:

<Payment>
    <Currency>USD</Currency>
    <BankPayment>300.82</BankPayment>
    <Cash>500</Cash>
</Payment>
<Payment>
    <Currency>EUR</Currency>
    <BankPayment>100</BankPayment>
</Payment>

我想我可以在这里使用数组或使用不同的数组,但我不知道如何处理来自非唯一项目的数据。 有没有办法解决这个问题? (我只能使用Xpath 1.0) 谢谢你的帮助!

1 个答案:

答案 0 :(得分:1)

  <xsl:key name="ccy" match="Income" use="Currency" />
  <xsl:template match="start">
    <xsl:for-each select="Income[count(. | key('ccy', Currency)[1]) = 1]">
      <xsl:sort select="Currency" />
      <xsl:element name="Payment">
        <xsl:element name="CurCode">
      <xsl:value-of select="Currency" />
        </xsl:element>
      <xsl:for-each select="key('ccy', Currency)">
        <xsl:sort select="Description" />
        <xsl:element name="{Description}">
          <xsl:value-of select="Sum" />
        </xsl:element>
      </xsl:for-each>
      </xsl:element>
    </xsl:for-each>
  </xsl:template>

注意 <Description>值不应包含任何空格,否则您可能会获得不正确的xml元素名称(xml不支持带空格的标记名称)。