#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 — Большое вам спасибо!