使用 XSLT(sybase 输出)将 XML 转换为 XML
Transform an XML to XML using XSLT ( sybase output )
我有以下问题。我不是最伟大的 XSLT 专家,我想成功的是将一个 XML 从 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>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>
我想要的输出方式
Header保持原样,Entry部分不同
<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>
也许,有人可以帮助我实现我想要的。
非常感谢。
试试这个作为你的起点:
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
部分需要其他内容,但我遵循了您的预期输出。
我有以下问题。我不是最伟大的 XSLT 专家,我想成功的是将一个 XML 从 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>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>
我想要的输出方式 Header保持原样,Entry部分不同
<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>
也许,有人可以帮助我实现我想要的。 非常感谢。
试试这个作为你的起点:
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
部分需要其他内容,但我遵循了您的预期输出。