Агрегирование узлов на основе подстроки - PullRequest
0 голосов
/ 12 января 2019

Я пытаюсь сопоставить узлы на основе совпадения подстроки. Ниже приведен XML-код, которым я управляю: -

<?xml version="1.0" encoding="utf-8"?>
<CurrencyPairs xmlns:wd="urn:com.workday/bsvc">
    <ActiveCurrenciesNumber>5</ActiveCurrenciesNumber>
    <CurrencyPair>AEDAFN</CurrencyPair>
    <CurrencyPair>AEDCHE</CurrencyPair>
    <CurrencyPair>AEDEUR</CurrencyPair>
    <CurrencyPair>AEDUSD</CurrencyPair>
    <CurrencyPair>AFNAED</CurrencyPair>
    <CurrencyPair>AFNCHE</CurrencyPair>
    <CurrencyPair>AFNEUR</CurrencyPair>
    <CurrencyPair>AFNUSD</CurrencyPair>
    <CurrencyPair>CHEAED</CurrencyPair>
    <CurrencyPair>CHEAFN</CurrencyPair>
    <CurrencyPair>CHEEUR</CurrencyPair>
    <CurrencyPair>CHEUSD</CurrencyPair>
    <CurrencyPair>EURAED</CurrencyPair>
    <CurrencyPair>EURAFN</CurrencyPair>
    <CurrencyPair>EURCHE</CurrencyPair>
    <CurrencyPair>EURUSD</CurrencyPair>
    <CurrencyPair>USDAED</CurrencyPair>
    <CurrencyPair>USDAFN</CurrencyPair>
    <CurrencyPair>USDCHE</CurrencyPair>
    <CurrencyPair>USDEUR</CurrencyPair>
    <PairsNumber>20</PairsNumber>
</CurrencyPairs>

Я пробовал несколько вещей, но я не могу получить желаемый результат на основе совпадения подстроки.
Желаемый результат должен быть таким, как показано ниже: -

<?xml version="1.0" encoding="utf-8"?>
<CurrencyPairs xmlns:wd="urn:com.workday/bsvc">
    <ActiveCurrenciesNumber>5</ActiveCurrenciesNumber>
    <CurrencyPair>AEDAFN,AEDCHE,AEDEUR,AEDUSD</CurrencyPair>
    <CurrencyPair>AFNAED,AFNCHE,AFNEUR,AFNUSD</CurrencyPair>
    <CurrencyPair>CHEAED,CHEAFN,CHEEUR,CHEUSD</CurrencyPair>
    <CurrencyPair>EURAED,EURAFN,EURCHE,EURUSD</CurrencyPair>
    <CurrencyPair>USDAED,USDAFN,USDCHE,USDEUR</CurrencyPair>
    </CurrencyPairs>

Я перепробовал несколько методов с использованием группировки и т. Д., Но все усилия оказались тщетными. Было бы здорово, если бы кто-то мог поделиться примером такого сценария.
Кто-нибудь может помочь в получении желаемого результата?

1 Ответ

0 голосов
/ 12 января 2019

Не уверен, что именно вы пробовали - кажется довольно простым, даже тривиальным:

XSLT 2.0

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

<xsl:template match="/CurrencyPairs">
    <xsl:copy>
        <xsl:copy-of select="ActiveCurrenciesNumber"/>
        <xsl:for-each-group select="CurrencyPair" group-by="substring(., 1, 3)">
            <CurrencyPair> 
                <xsl:value-of select="current-group()" separator=","/>
            </CurrencyPair>
        </xsl:for-each-group>
    </xsl:copy>
</xsl:template>

</xsl:stylesheet>
...