Преобразование XML в XML с помощью XSLT (вывод sybase)

#xml #xslt #transformation

#xml #xslt #преобразование

Вопрос:

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

Вывод Sybase:

 <?xml version="1.0" encoding="ISO-8859-1"?>
<?xml-stylesheet type="text/xsl" href="C:UsersH50S5OBDesktopstyle.xsl"?>
<root>
<row>
    <Cpty_Id>1</Cpty_Id>
    <SENDER>xxx</SENDER>
    <KUNDE>123</KUNDE>
    <DEPOT>123</DEPOT>
    <ACCOUNT_DEBIT>123</ACCOUNT_DEBIT>
    <ACCOUNT_CREDIT>123</ACCOUNT_CREDIT>
    <CREATED>07.10.2016</CREATED>
    <DEALTYPE>FEES</DEALTYPE>
    <STATEMENT_FROM>30.09.2016</STATEMENT_FROM>
    <STATEMENT_TO>30.09.2016</STATEMENT_TO>
    <BUYSELL>V</BUYSELL>
    <WPNAME>AT0123456789</WPNAME>
    <NOMINAL>1.0</NOMINAL>
    <PRICE>117,155</PRICE>
    <DEAL_STARTDATE>07.10.2016</DEAL_STARTDATE>
    <DEAL_ENDDATE>28.06.2017</DEAL_ENDDATE>
    <FEES_PERCENT>2.5941420000000002</FEES_PERCENT>
    <FEES_AMOUNT>150.0</FEES_AMOUNT>
    <FEES_CREDIT>3.9100000000000001</FEES_CREDIT>
    <FEES>3.9100000000000001</FEES>
</row>
<row>
    <Cpty_Id>1</Cpty_Id>
    <SENDER>xxx</SENDER>
    <KUNDE>123</KUNDE>
    <DEPOT>123</DEPOT>
    <ACCOUNT_DEBIT>123</ACCOUNT_DEBIT>
    <ACCOUNT_CREDIT>123</ACCOUNT_CREDIT>
    <CREATED>07.10.2016</CREATED>
    <DEALTYPE>FEES</DEALTYPE>
    <STATEMENT_FROM>30.09.2016</STATEMENT_FROM>
    <STATEMENT_TO>30.09.2016</STATEMENT_TO>
    <BUYSELL>V</BUYSELL>
    <WPNAME>AT0123456789</WPNAME>
    <NOMINAL>1.0</NOMINAL>
    <PRICE>117,155</PRICE>
    <DEAL_STARTDATE>07.10.2016</DEAL_STARTDATE>
    <DEAL_ENDDATE>28.06.2017</DEAL_ENDDATE>
    <FEES_PERCENT>2.5941420000000002</FEES_PERCENT>
    <FEES_AMOUNT>150.0</FEES_AMOUNT>
    <FEES_CREDIT>3.9100000000000001</FEES_CREDIT>
    <FEES>3.9100000000000001</FEES>
</row>
</root>
  

Вывод того, как я хотел бы его иметь
Заголовок остается таким, какой он есть, раздел ввода отличается

    <CONFIRM>
    <Cpty_Id>1</Cpty_Id>
    <SENDER>xxx</SENDER>
    <KUNDE>123</KUNDE>
    <DEPOT>123</DEPOT>
    <ACCOUNT_DEBIT>123</ACCOUNT_DEBIT>
    <ACCOUNT_CREDIT>123</ACCOUNT_CREDIT>
    <CREATED>07.10.2016</CREATED>
    <DEALTYPE>FEES</DEALTYPE>
    <STATEMENT_FROM>30.09.2016</STATEMENT_FROM>
    <STATEMENT_TO>30.09.2016</STATEMENT_TO>
    <ENTRY>
        <BUYSELL>V</BUYSELL>
        <WPNAME>AT0123456789</WPNAME>
        <NOMINAL>1.0</NOMINAL>
        <PRICE>117,155</PRICE>
        <DEAL_STARTDATE>07.10.2016</DEAL_STARTDATE>
        <DEAL_ENDDATE>28.06.2017</DEAL_ENDDATE>
        <FEES_PERCENT>2.5941420000000002</FEES_PERCENT>
        <FEES_AMOUNT>150.0</FEES_AMOUNT>
    </ENTRY>
    <ENTRY>
        <BUYSELL>E</BUYSELL>
        <WPNAME>AT0123456789</WPNAME>
        <NOMINAL>1.0</NOMINAL>
        <PRICE>117,155</PRICE>
        <DEAL_STARTDATE>07.10.2016</DEAL_STARTDATE>
        <DEAL_ENDDATE>28.06.2017</DEAL_ENDDATE>
        <FEES_PERCENT>2.5941420000000002</FEES_PERCENT>
        <FEES_AMOUNT>150.0</FEES_AMOUNT>
    </ENTRY>
    <SUM>
        <FEES_CREDIT>3.9100000000000001</FEES_CREDIT>
        <FEES>3.9100000000000001</FEES>
    </SUM>
   </CONFIRM>
  

Пока это мой XSLT (не очень, извините)

     <?xml version="1.0" encoding="ISO-8859-1"?>
    <xsl:stylesheet          version="1.0"xmlns:xsl="http://www.w3.org/1999/XSL/Transform"xmlns:foo="http://www.foo.org/" xmlns:bar="http://www.bar.org">
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
    <xsl:template match="/">
    <html>
    <body>
    <table border="0">
      <xsl:for-each select="row">
        <SENDER><xsl:value-of select="SENDER"/></SENDER>
        <KUNDE><xsl:value-of select="KUNDE"/></KUNDE>
        <DEPOT><xsl:value-of select="DEPOT"/></DEPOT>
        <ADRESS1><xsl:value-of select="ACCOUNT_DEBIT"/></ADRESS1>
        <ADRESS2><xsl:value-of select="ACCOUNT_DEBIT"/></ADRESS2>
        <ADRESS3><xsl:value-of select="ACCOUNT_DEBIT"/></ADRESS3>
        <ADRESS4><xsl:value-of select="ACCOUNT_DEBIT"/></ADRESS4>
        <ACCOUNT_DEBIT><xsl:value-of select="ACCOUNT_DEBIT"/></ACCOUNT_DEBIT>
        <ACCOUNT_CREDIT><xsl:value-of select="ACCOUNT_CREDIT"/></ACCOUNT_CREDIT>
        <CREATED><xsl:value-of select="CREATED"/></CREATED>
        <DEALTYPE><xsl:value-of select="DEALTYPE"/></DEALTYPE>
        <STATEMENT_FROM><xsl:value-of select="STATEMENT_FROM"/></STATEMENT_FROM>
        <STATEMENT_TO><xsl:value-of select="STATEMENT_TO"/></STATEMENT_TO>
      </xsl:for-each>
      <ENTRY>
      <xsl:element name="BUYSELL">
      <xsl:element name="WPNAME">
       </xsl:element>
    </ENTRY>
    </table>
  </body>
  </html>
</xsl:template>
</xsl:stylesheet>
  

Может быть, кто-нибудь может помочь мне достичь того, чего я хочу.
Большое вам спасибо.

Комментарии:

1. Использование for-each — это почти запах кода в XSLT. Попробуйте вместо этого использовать (больше) шаблонов.

2. Вы уверены, что ваш ввод выглядит именно так? Два (или более) row элемента, над которыми нет ни одного корневого элемента? — также неясно, почему ваш ввод имеет два row s, но в вашем выводе есть только один ENTRY .

3. Да, именно так выглядит мой ввод — он поступает из Sybase и предоставляет его таким образом, как кажется. Спасибо за ВВОД выходных данных, я забыл записать его, я отредактировал его.

4. Если это ваш ввод, он не является XML и не может быть обработан XSLT.

5. Я помещаю корневой тег в начале, поэтому он должен быть обработан, по крайней мере, я не получаю сообщения об ошибке в Altova XML Spy

Ответ №1:

Попробуйте это в качестве отправной точки:

XSLT 1.0

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

<xsl:template match="/root">
    <CONFIRM>
        <!-- header -->
        <xsl:for-each select="row[1]">
            <xsl:copy-of select="Cpty_Id | SENDER | KUNDE | DEPOT |ACCOUNT_DEBIT | ACCOUNT_CREDIT | CREATED | DEALTYPE | STATEMENT_FROM | STATEMENT_TO"/>
        </xsl:for-each>
        <!-- entries -->
        <xsl:for-each select="row">
            <ENTRY>
                <xsl:copy-of select="BUYSELL | WPNAME | NOMINAL | PRICE | DEAL_STARTDATE |DEAL_ENDDATE | FEES_PERCENT | FEES_AMOUNT"/>
            </ENTRY>
        </xsl:for-each>
        <!-- footer -->
        <xsl:for-each select="row[1]">
            <SUM>
                <xsl:copy-of select="FEES_CREDIT | FEES "/>
            </SUM>
        </xsl:for-each>
   </CONFIRM>
</xsl:template>

</xsl:stylesheet>
  

Предполагается, что все общие данные (до и после ENTRY элементов) одинаковы для всех row s и могут быть взяты из первого row .

Я подозреваю SUM , что часть должна быть чем-то другим, но я следил за вашим ожидаемым результатом.

Комментарии:

1. Большое вам спасибо. Это то, что я искал последние часы. У меня всегда были некоторые идеи о том, как сделать это правильно, но потом я всегда терпел неудачу из-за недостатка знаний. Часть СУММЫ находится в нужном месте, и в конце она должна быть СУММОЙ одного из приведенных выше тегов, однако это уже должно быть доставлено через Sybase — Большое вам спасибо!