2016-10-07 125 views
1

我有以下问题。我不是在XSLT最大的专家,和我想要的成功是从Sybase将XML以下几点:的Sybase转换XML到XML

输出:

的我怎么也想有
<?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

使用'换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 S也是一样的,并能取自第一个row

我怀疑SUM部分需要别的东西,但我也跟着你的期望的输出。

+0

非常感谢。这就是我正在寻找最后几个小时的情况。我总是有一些关于如何正确理解的想法,但由于缺乏知识,我总是失败。 SUM部分位于正确的位置,最后它应该是上述其中一个标记的SUM,但是,这应该已经通过Sybase提供 - 非常感谢! – user2806315