2017-02-08 4 views
1

У меня есть эти требования для сортировки конкретного элемента. Но я не знаю, как я это сделаю. Я пробовал XSLT, который я видел, но я не могу получить ожидаемый результат, который я хотел. Входной XML, как это:Сортировка элементов с использованием XSLT

<SyncCredit xmlns="http://schema.XYZ.com/XYZOAGIS/2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" releaseID="9.2" versionID="2.12.3"> 
    <Data> 
    <AccountingNo>ERP_12344</AccountingNo> 
    <Credit> 
     <Header> 
     <Name>Supplier Bank</Name> 
     <Date>02-08-2017</Date> 
     </Header> 
     <Payment> 
     <ID>111</ID> 
     <Date>02-01-2017</Date> 
     <Transaction> 
      <BookNo>AA-111</BookNo> 
      <Creditor> 
      <PartyID> 
       <ID schemeName="PassportNo">1000</ID> 
      </PartyID> 
      </Creditor> 
     </Transaction> 
     <Transaction> 
      <BookNo>AA-111</BookNo> 
      <Creditor> 
      <PartyID> 
       <ID schemeName="TaxIdentificationNo">5000</ID> 
      </PartyID> 
      </Creditor> 
     </Transaction> 
     </Payment> 
     <Payment> 
     <ID>222</ID> 
     <Date>02-05-2017</Date> 
     <Transaction> 
      <BookNo>AA-111</BookNo> 
      <Creditor> 
      <PartyID> 
       <ID schemeName="BankPartyNo">4000</ID> 
      </PartyID> 
      </Creditor> 
     </Transaction> 
     <Transaction> 
      <BookNo>AA-111</BookNo> 
      <Creditor> 
      <PartyID> 
       <ID schemeName="DriverLicense">2000</ID> 
      </PartyID> 
      </Creditor> 
     </Transaction> 
     </Payment> 
    </Credit> 
    </Data> 
</SyncCredit> 

Мой ожидаемый результат должен выглядеть следующим образом:

<SyncCredit xmlns="http://schema.XYZ.com/XYZOAGIS/2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" releaseID="9.2" versionID="2.12.3"> 
    <Data> 
    <AccountingNo>ERP_12344</AccountingNo> 
    <Credit> 
     <Header> 
     <Name>Supplier Bank</Name> 
     <Date>02-08-2017</Date> 
     </Header> 
     <Payment> 
     <ID>111</ID> 
     <Date>02-01-2017</Date> 
     <Transaction> 
      <BookNo>AA-111</BookNo> 
      <Creditor> 
      <PartyID> 
       <ID schemeName="PassportNo">1000</ID> 
      </PartyID> 
      </Creditor> 
     </Transaction> 
     </Payment> 
     <Payment> 
     <ID>222</ID> 
     <Date>02-05-2017</Date> 
     <Transaction> 
      <BookNo>AA-111</BookNo> 
      <Creditor> 
      <PartyID> 
       <ID schemeName="DriverLicense">2000</ID> 
      </PartyID> 
      </Creditor> 
     </Transaction> 
     </Payment> 
     <Payment> 
     <ID>222</ID> 
     <Date>02-05-2017</Date> 
     <Transaction> 
      <BookNo>AA-111</BookNo> 
      <Creditor> 
      <PartyID> 
       <ID schemeName="BankPartyNo">4000</ID> 
      </PartyID> 
      </Creditor> 
     </Transaction> 
     </Payment> 
     <Payment> 
     <ID>111</ID> 
     <Date>02-01-2017</Date> 
     <Transaction> 
      <BookNo>AA-111</BookNo> 
      <Creditor> 
      <PartyID> 
       <ID schemeName="TaxIdentificationNo">5000</ID> 
      </PartyID> 
      </Creditor> 
     </Transaction> 
     </Payment> 
    </Credit> 
    </Data> 
</SyncCredit> 

Элементы/PartyID/ID Кредитор должен быть отсортирован, сохраняя при этом другие элементы нетронутыми. Тем не менее, мне нужно разделить отсортированный Creditor/PartyID/ID на каждый узел <Payment>. Я использую XSLT v2.0. Хотя, я могу сортировать Кредитору/PartyID/ID надлежащим образом с помощью <xsl:perform-sort> из ссылки, которую я получил, выход я получаю, как это:

<Payment> 
    <Transaction xmlns="http://schema.XYZ.com/XYZOAGIS/2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <BookNo>AA-111</BookNo> 
    <Creditor> 
     <PartyID> 
     <ID schemeName="PassportNo">1000</ID> 
     </PartyID> 
    </Creditor> 
    </Transaction> 
    <Transaction xmlns="http://schema.XYZ.com/XYZOAGIS/2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <BookNo>AA-111</BookNo> 
    <Creditor> 
     <PartyID> 
     <ID schemeName="DriverLicense">2000</ID> 
     </PartyID> 
    </Creditor> 
    </Transaction> 
    <Transaction xmlns="http://schema.XYZ.com/XYZOAGIS/2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <BookNo>AA-111</BookNo> 
    <Creditor> 
     <PartyID> 
     <ID schemeName="BankPartyNo">4000</ID> 
     </PartyID> 
    </Creditor> 
    </Transaction> 
    <Transaction xmlns="http://schema.XYZ.com/XYZOAGIS/2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <BookNo>AA-111</BookNo> 
    <Creditor> 
     <PartyID> 
     <ID schemeName="TaxIdentificationNo">5000</ID> 
     </PartyID> 
    </Creditor> 
    </Transaction> 

Это мой XSLT, это не является полным, потому что я не знаю, как я буду копировать элементы под заголовком и из Payment.I только пытался сделать XSLT в элементе Transaction.

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0" xpath-default-namespace="http://schema.XYZ.com/XYZOAGIS/2"> 
<xsl:output method="xml" omit-xml-declaration="yes" indent="no"/> 
<xsl:template match="/"> 
    <xsl:variable name="Transaction"> 
     <xsl:perform-sort select="SyncCredit/Data/Credit/Payment/Transaction"> 
      <xsl:sort data-type="number" select="Creditor/PartyID/ID"/> 
     </xsl:perform-sort> 
    </xsl:variable> 
    <Payment> 
     <xsl:copy-of select="$Transaction"/> 
    </Payment> 
</xsl:template> 

Спасибо заранее.

+0

Покажите нам XSLT, что вы пробовали. –

+0

Вопрос не ясен. Обратите внимание, что ваш вывод имеет другую _структуру, чем вход. На входе каждый '' содержит _two_ '' s, но в ожидаемом выходе каждая транзакция была разделена на собственный платежный узел. –

+0

@ Jim Garrison: Спасибо. Я уже редактировал свой пост и включил XSLT, который я создал. Да, ты прав. При вводе тег Payment содержит 2 тега транзакции. Мне нужно сортировать Creditor/PartyID/ID, и мне нужно разделить его на свой собственный платежный узел. –

ответ

0

Если я понимаю, это правильно, что вы хотите сделать:

XSLT 2,0

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

<!-- identity transform --> 
<xsl:template match="@*|node()"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*|node()"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="Credit"> 
    <xsl:copy> 
     <xsl:copy-of select="Header"/> 
     <xsl:apply-templates select="Payment/Transaction"> 
      <xsl:sort select="Creditor/PartyID/ID" data-type="number" order="ascending"/> 
     </xsl:apply-templates> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="Transaction"> 
    <Payment> 
     <xsl:copy-of select="../ID, ../Date, ."/> 
    </Payment> 
</xsl:template> 

</xsl:stylesheet> 
+0

Привет @ michael.hor257k, да, ваше понимание правильное. Большое вам спасибо за ваши отзывы. Очень признателен. У меня уже есть ожидаемый результат. Огромное спасибо. –