我正在嘗試通過 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>
uj5u.com熱心網友回復:
對于 XSLT 2 或 3 處理器,您希望xpath-default-namespace=""urn:iso:std:iso:20022:tech:xsd:camt.054.001.02"在xsl:stylesheet元素上宣告,例如,然后在 XSLT 代碼中寫入路徑,您可以在其中使用輸入檔案中的本地元素名稱。Anyxsl:template需要是xsl:stylesheet.
對于 XSLT 1 處理器,您需要將名稱空間 URI 系結到 XSLT 中的前綴(例如xmlns:camt="urn:iso:std:iso:20022:tech:xsd:camt.054.001.02"),并使用該前綴來限定路徑運算式中的任何元素名稱。
uj5u.com熱心網友回復:
如果</Document>結束標記出現在樣式表的末尾(您沒有向我們展示),那么您的所有 XSLT 代碼都位于頂級資料元素中,這相當于將其注釋掉。結果是您在源檔案上執行了“空樣式表”,它將從源檔案復制文本節點并忽略其他所有內容。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/397754.html
