我正试图通过xslt转换从XML文件生成csv文件。xml文件的开头:
<?xml version="1.0" encoding="UTF-8"?>
<Document xmlns="urn:iso:std:iso:20022:tech:xsd:camt.054.001.02"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<BkToCstmrDbtCdtNtfctn>
<GrpHdr>
<MsgId>UPDD2021-12-20-18.26.01.660000</MsgId>
<CreDtTm>2021-12-20T18:26:01</CreDtTm>
</GrpHdr>
...
</BkToCstmrDbtCdtNtfctn>
</Document>
转换文件:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<Document xmlns="urn:iso:std:iso:20022:tech:xsd:camt.054.001.02" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<xsl:output indent="yes" method="text"/>
<xsl:variable select="';'" name="delimiter"/>
<xsl:variable name="newline">
<xsl:text>
</xsl:text>
</xsl:variable>
<xsl:template match="/">
<xsl:for-each select="BkToCstmrDbtCdtNtfctn/Ntfctn/Ntry/NtryDtls/TxDtls">
<xsl:value-of select="../../../../GrpHdr/MsgId"/>
<xsl:value-of select="$delimiter"/>
<xsl:value-of select="../../../../Ntfctn/CreDtTm"/>
<xsl:value-of select="$delimiter"/>
<xsl:value-of select="$newline"/>
</xsl:for-each>
</xsl:template>
</Document>
</xsl:stylesheet>
然而,csv文件并没有按预期生成,因为它看起来像这样(每条记录都在新行上(:
UPDD2021-12-20-18.26.01.660000
2021-12-20T18:26:01
003409153772021-12-20-18.26.01.9625
2021-12-20T18:26:01
当我从两个文件中删除标记Document>
时,它看起来是正确的(添加了";",并且每一个都在一行上(:
UPDD2021-12-20-18.26.01.660000;2021-12-20T18:26:01;
有人知道如何更新转换文件以使csv看起来正确吗?
问题已解决。正确转换:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:camt="urn:iso:std:iso:20022:tech:xsd:camt.054.001.02"
exclude-result-prefixes="camt">
<xsl:output indent="yes" method="text"/>
<xsl:variable select="';'" name="delimiter"/>
<xsl:variable name="newline">
<xsl:text>
</xsl:text>
</xsl:variable>
<xsl:template match="/">
<xsl:for-each select="camt:Document/camt:BkToCstmrDbtCdtNtfctn/camt:Ntfctn/camt:Ntry/camt:NtryDtls/camt:TxDtls">
<xsl:value-of select="../../../../camt:GrpHdr/camt:MsgId"/>
<xsl:value-of select="$delimiter"/>
<xsl:value-of select="../../../../camt:Ntfctn/camt:CreDtTm"/>
<xsl:value-of select="$delimiter"/>
<xsl:value-of select="$newline"/>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
使用XSLT 2或3处理器,您希望在xsl:stylesheet
元素上声明例如xpath-default-namespace=""urn:iso:std:iso:20022:tech:xsd:camt.054.001.02"
,然后在XSLT代码中写入路径,在其中您可以使用输入文档中的本地元素名称。任何xsl:template
都需要是xsl:stylesheet
的顶级子级。
对于XSLT1处理器,您需要将名称空间URI绑定到XSLT中的前缀(例如xmlns:camt="urn:iso:std:iso:20022:tech:xsd:camt.054.001.02"
(,并使用该前缀限定路径表达式中的任何元素名称。
如果</Document>
结束标记出现在样式表的末尾(您还没有向我们展示(,那么所有XSLT代码都在一个顶级数据元素中,这相当于注释掉它。结果是,您已经执行了";空样式表";在源文档上,它将从源文档复制文本节点并忽略其他所有内容。