我有一个带有命名空间的XML,如下所示,我试图使用下面的XSLT转换为csv / text但不能正常工作。有人可以告诉我我做错了什么或根据所需的输出更正我的解析器吗?
<?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>
<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>
</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
答案 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>
</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>
</xsl:text>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>