使用xslt转换的带有命名空间的XML到平面文件转换

时间:2017-04-18 06:54:37

标签: xml xslt

我有一个带有命名空间的XML,如下所示,我试图使用下面的XSLT转换为csv / text但不能正常工作。有人可以告诉我我做错了什么或根据所需的输出更正我的解析器吗?

XML

<?xml version="1.0" encoding="UTF-8"?>
<tns:B3Msg xmlns:tns="http://www.example.org/B3" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.example.org/B3 B3_RISK_FX.xsd ">
<tns:InitSystem>TEST</tns:InitSystem>
<tns:InitSystemRefId>654321</tns:InitSystemRefId>
<tns:ValueDate>2017-03-27</tns:ValueDate>
<tns:ProdType>SWAP</tns:ProdType>
<tns:FirmAccount>OIL</tns:FirmAccount>
<tns:OASYSDealId>0</tns:OASYSDealId>
<tns:OASYSTransactionId>0</tns:OASYSTransactionId>
<tns:SysTradeid>123456</tns:SysTradeid>
<tns:UniqueSysTradeid>123456</tns:UniqueSysTradeid>
<tns:Corpus>
<tns:LEG_NUM>0</tns:LEG_NUM>
<tns:MTM_USD>100.00000000</tns:MTM_USD>
<tns:MTM_LOCAL_CURRENCY>USD</tns:MTM_LOCAL_CURRENCY>
</tns:Corpus>
<tns:Corpus>
<tns:LEG_NUM>1</tns:LEG_NUM>
<tns:MTM_USD>123.00000000</tns:MTM_USD>
<tns:MTM_LOCAL_CURRENCY>USD</tns:MTM_LOCAL_CURRENCY>
</tns:Corpus>
</tns:B3Msg>

XSLT

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >
<xsl:output method="text" omit-xml-declaration="yes" indent="no"/>
<xsl:template match="/">
<xsl:text>InitSystem,ProdType,SysTradeid,UniqueSysTradeid,LEG_NUM,MTM_USD</xsl:text>
   <xsl:for-each select="//">
    <xsl:value-of select="ancestor::B3Msg/InitSystem"/><xsl:text>,</xsl:text>
    <xsl:value-of select="ancestor::B3Msg/ProdType"/><xsl:text>,</xsl:text>
    <xsl:value-of select="ancestor::B3Msg/SysTradeid"/><xsl:text>,</xsl:text>
    <xsl:value-of select="ancestor::B3Msg/UniqueSysTradeid"/><xsl:text>,</xsl:text>
    <xsl:value-of select="LEG_NUM"/><xsl:text>,</xsl:text>
    <xsl:value-of select="MTM_USD"/>
    <xsl:text>&#xA;</xsl:text>
  </xsl:for-each>
</xsl:template>
</xsl:stylesheet>

必需输出

InitSystem,ProdType,SysTradeid,UniqueSysTradeid,LEG_NUM,MTM_USD
TEST,SWAP,123456,1234560,100
TEST,SWAP,123456,1234560,123

1 个答案:

答案 0 :(得分:1)

您在问题中提到了名称空间,但没有在XSLT中处理指定的名称空间。这意味着您需要在XSLT中使用前缀声明命名空间,并对该命名空间中的XML中的任何元素使用该前缀

试试这个XSLT

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:tns="http://www.example.org/B3">
<xsl:output method="text" />

<xsl:template match="/">
   <xsl:text>InitSystem,ProdType,SysTradeid,UniqueSysTradeid,LEG_NUM,MTM_USD</xsl:text>
   <xsl:text>&#xA;</xsl:text>
   <xsl:for-each select="//tns:Corpus">
    <xsl:value-of select="ancestor::tns:B3Msg/tns:InitSystem"/><xsl:text>,</xsl:text>
    <xsl:value-of select="ancestor::tns:B3Msg/tns:ProdType"/><xsl:text>,</xsl:text>
    <xsl:value-of select="ancestor::tns:B3Msg/tns:SysTradeid"/><xsl:text>,</xsl:text>
    <xsl:value-of select="ancestor::tns:B3Msg/tns:UniqueSysTradeid"/><xsl:text>,</xsl:text>
    <xsl:value-of select="tns:LEG_NUM"/><xsl:text>,</xsl:text>
    <xsl:value-of select="tns:MTM_USD"/>
    <xsl:text>&#xA;</xsl:text>
  </xsl:for-each>
</xsl:template>
</xsl:stylesheet>