xsl xml batching - PullRequest
       1

xsl xml batching

1 голос
/ 31 марта 2011

Мне нужно реализовать некоторые виды пакетирования в сопоставлении xsl.Пример:

Ввод:

    <FinTrans_Dinas_FF xmlns="http://MH.ESB.Dinas.Schemas.FinTrans_FF.FinTrans_FF">
        <Line xmlns="">
            <Header>
                <DocumentDate>03022011</DocumentDate>
                <Reference>71013849</Reference>
            </Header>
            <Item>
                <PostingKey>01</PostingKey>
                <AccountNumber>0000560141</AccountNumber>
                <AmountInDocumentCurrency>/</AmountInDocumentCurrency>
                <AmountInLocalCurrency>21,42</AmountInLocalCurrency>
            </Item>
        </Line>
        <Line xmlns="">
            <Header>
                <DocumentDate>03022011</DocumentDate>
                <Reference>71013849</Reference>
            </Header>
            <Item>
                <PostingKey>01</PostingKey>
                <AccountNumber>0000560141</AccountNumber>
                <AmountInDocumentCurrency>/</AmountInDocumentCurrency>
                <AmountInLocalCurrency>21,42</AmountInLocalCurrency>
            </Item>
        </Line>
        <Line xmlns="">
            <Header>
                <DocumentDate>03022011</DocumentDate>
                <Reference>77777777</Reference>
            </Header>
            <Item>
                <PostingKey>02</PostingKey>
                <AccountNumber>0000560141</AccountNumber>
                <AmountInDocumentCurrency>/</AmountInDocumentCurrency>
                <AmountInLocalCurrency>21,42</AmountInLocalCurrency>
            </Item>
        </Line>
    </FinTrans_Dinas_FF>

Теперь мне нужно создать запись для каждой уникальной строки (ключ = ссылка).Итак, во входном сообщении у меня есть 2 уникальные записи:

Reference = 71013849
Reference = 77777777

Итак, мой выходной файл должен выглядеть так (немного упростил):

       <Trans>
        <Record>
            <Lines>
                <Line>
                    <Reference>71013849</Reference>
                    <Account>Account1</Account>
                </Line>
                <Line>
                    <Reference>71013849</Reference>
                    <Account>Account2</Account>
                </Line>
            </Lines>
        </Record>
        <Record>
            <Lines>
                <Line>
                    <Reference>77777777</Reference>
                    <Account>Account3</Account>
                </Line>
            </Lines>
        </Record>
    </Trans>

Итак, как вы можете видетьмой входной файл содержит 3 элемента 'Line', мой вывод содержит 2 элемента 'Record' (внутри узла Record находятся строки).Очевидно, что внутри элемента 'Lines / Line' должно быть больше данных, но я упростил его для этого примера.

Кто-нибудь знает лучший способ решить эту проблему?(В XSLT 1.0)

Большое спасибо!

1 Ответ

3 голосов
/ 31 марта 2011

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

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

 <xsl:key name="kLineByRef" match="Line"
          use="Header/Reference"/>

 <xsl:template match=
  "Line[generate-id()
       =
        generate-id(key('kLineByRef', Header/Reference)[1])
       ]">
  <Record>
    <xsl:copy-of select="key('kLineByRef', Header/Reference)"/>
  </Record>
 </xsl:template>
 <xsl:template match="text()"/>
</xsl:stylesheet>

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

<FinTrans_Dinas_FF xmlns="http://MH.ESB.Dinas.Schemas.FinTrans_FF.FinTrans_FF">
    <Line xmlns="">
        <Header>
            <DocumentDate>03022011</DocumentDate>
            <Reference>71013849</Reference>
        </Header>
        <Item>
            <PostingKey>01</PostingKey>
            <AccountNumber>0000560141</AccountNumber>
            <AmountInDocumentCurrency>/</AmountInDocumentCurrency>
            <AmountInLocalCurrency>21,42</AmountInLocalCurrency>
        </Item>
    </Line>
    <Line xmlns="">
        <Header>
            <DocumentDate>03022011</DocumentDate>
            <Reference>71013849</Reference>
        </Header>
        <Item>
            <PostingKey>01</PostingKey>
            <AccountNumber>0000560141</AccountNumber>
            <AmountInDocumentCurrency>/</AmountInDocumentCurrency>
            <AmountInLocalCurrency>21,42</AmountInLocalCurrency>
        </Item>
    </Line>
    <Line xmlns="">
        <Header>
            <DocumentDate>03022011</DocumentDate>
            <Reference>77777777</Reference>
        </Header>
        <Item>
            <PostingKey>02</PostingKey>
            <AccountNumber>0000560141</AccountNumber>
            <AmountInDocumentCurrency>/</AmountInDocumentCurrency>
            <AmountInLocalCurrency>21,42</AmountInLocalCurrency>
        </Item>
    </Line>
</FinTrans_Dinas_FF>

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

<Record>
   <Line>
      <Header>
         <DocumentDate>03022011</DocumentDate>
         <Reference>71013849</Reference>
      </Header>
      <Item>
         <PostingKey>01</PostingKey>
         <AccountNumber>0000560141</AccountNumber>
         <AmountInDocumentCurrency>/</AmountInDocumentCurrency>
         <AmountInLocalCurrency>21,42</AmountInLocalCurrency>
      </Item>
   </Line>
   <Line>
      <Header>
         <DocumentDate>03022011</DocumentDate>
         <Reference>71013849</Reference>
      </Header>
      <Item>
         <PostingKey>01</PostingKey>
         <AccountNumber>0000560141</AccountNumber>
         <AmountInDocumentCurrency>/</AmountInDocumentCurrency>
         <AmountInLocalCurrency>21,42</AmountInLocalCurrency>
      </Item>
   </Line>
</Record>
<Record>
   <Line>
      <Header>
         <DocumentDate>03022011</DocumentDate>
         <Reference>77777777</Reference>
      </Header>
      <Item>
         <PostingKey>02</PostingKey>
         <AccountNumber>0000560141</AccountNumber>
         <AmountInDocumentCurrency>/</AmountInDocumentCurrency>
         <AmountInLocalCurrency>21,42</AmountInLocalCurrency>
      </Item>
   </Line>
</Record>

Пояснение : Метод Мюнхена для группировки .

Когда количество записей и различных значений ключей значимо, это наиболее эффективный из известных методов группировки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...