Учитывать уникальные значения в разных кодах (XSLT 1) - PullRequest
1 голос
/ 08 сентября 2010

Застрял немного в следующем и хотел бы некоторые идеи / указатели в правильном направлении. У меня есть следующий XML:

<RecordsCollection>
  <CustomerRecord>
    <customerId>12345</customerId>
    <currency>USD</currency>
  </CustomerRecord>
  <CustomerRecord>
    <customerId>12345</customerId>
    <currency>USD</currency>
  </CustomerRecord>
  <CustomerRecord>
    <customerId>90210</customerId>
    <currency>USD</currency>
  </CustomerRecord>
</RecordsCollection>

Что мне нужно сделать, это просто создать единственное значение, содержащее количество уникальных элементов валюты, содержащихся с уникальным номером счета. Чтобы пояснить далее, приведенный выше пример содержит две записи с одинаковой валютой (USD) для одного и того же номера счета (12345), поэтому они учитываются как 1, а другая запись также считается 1. Следовательно, приведенный выше пример должен в:

<totalCount>2</totalCount>

Есть идеи, как этого добиться? Я знаю, как выбрать разные номера счетов, но мне кажется, что я не могу обернуть голову в то, как считать разные валюты в каждом счете.

Наконец, это должно быть сделано с использованием XSLT 1.0 ... любые мысли будут с благодарностью!

Ответы [ 2 ]

0 голосов
/ 08 сентября 2010

Это преобразование :

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>

 <xsl:key name="kCurrencyByIdAndType" match="currency"
  use="concat(../customerId, '+', .)"/>

 <xsl:template match="/*">
  <totalCount>
   <xsl:value-of select=
    "count(*/currency[generate-id(key('kCurrencyByIdAndType',
                                      concat(../customerId, '+', .)
                                      )[1]
                                 )
                    = generate-id()
                    ]
          )
    "/>
  </totalCount>
 </xsl:template>
</xsl:stylesheet>

при применении к предоставленному XML-документу :

<RecordsCollection>
  <CustomerRecord>
    <customerId>12345</customerId>
    <currency>USD</currency>
  </CustomerRecord>
  <CustomerRecord>
    <customerId>12345</customerId>
    <currency>USD</currency>
  </CustomerRecord>
  <CustomerRecord>
    <customerId>90210</customerId>
    <currency>USD</currency>
  </CustomerRecord>
</RecordsCollection>

создает искомое, правильный результат :

<totalCount>2</totalCount>

Объяснение: Метод группирования по Мюнхену используется для составного ключа, который может быть выражен как объединение строковых значений любых currency и его customerId родной брат.

0 голосов
/ 08 сентября 2010

Эта таблица стилей:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:key name="kRecordByIdAndCurr" match="CustomerRecord"
             use="concat(customerId,'++',currency)"/>
    <xsl:template match="/">
        <totalCount>
            <xsl:value-of select="count(*/*
                                         [count(.|key('kRecordByIdAndCurr',
                                                      concat(customerId,
                                                             '++',
                                                             currency)
                                                     )[1]
                                               )=1])"/>
        </totalCount>
    </xsl:template>
</xsl:stylesheet>

Вывод:

<totalCount>2</totalCount>

Примечание: Просто группировка по customerId и currency строковому значению.

Редактировать: Извините, пропустите customerId раньше.

...