-1

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>、正しく表示されます (「;」が追加され、それぞれが 1 行に表示されます)。

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>
4

2 に答える 2

0

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") にバインドし、そのプレフィックスを使用してパス式の要素名を修飾する必要があります。

于 2021-12-29T11:57:17.720 に答える