2016-10-07 3 views
1

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

Вывод Sybase:

<?xml version="1.0" encoding="ISO-8859-1"?> 
<?xml-stylesheet type="text/xsl" href="C:\Users\H50S5OB\Desktop\style.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>AT</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>AT</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>AT</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>AT</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> 

Возможно, кто-то может помочь мне достичь того, чего я хочу. спасибо.

+0

Использование 'for-each' - это почти запах кода в XSLT. Попробуйте использовать (более) шаблоны. – DanMan

+0

Вы уверены, что так выглядит ваш ввод? Два (или более) элемента 'row', без одного корневого элемента над ними? - также непонятно, почему ваш ввод имеет две строки, но на вашем выходе есть только один «ENTRY». –

+0

Да, так выглядит мой ввод - он исходит из Sybase и обеспечивает его таким образом, как кажется. Спасибо за выход ENTRY, я забыл записать его, я его отредактировал. – user2806315

ответ

0

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

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 с, и может взяты с первого row.

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

+0

Большое спасибо. Это то, что я искал последние часы. У меня всегда были идеи о том, как правильно это сделать, но я всегда терпел неудачу из-за недостатка знаний. Часть SUM находится в нужном месте, и в конце она должна быть SUM одного из тегов выше, однако это уже должно быть доставлено через Sybase - Большое вам спасибо! – user2806315

Смежные вопросы