如何使用 XSLT 从 XML 中删除元素标记

Posted

技术标签:

【中文标题】如何使用 XSLT 从 XML 中删除元素标记【英文标题】:How to Remove Element Tags from XML Using XSLT 【发布时间】:2021-12-06 10:03:01 【问题描述】:

我有一个 XML 文件,我需要在其中删除一些元素标签,我的问题是如何使用 XSLT 转换 XML 文件。在此示例中,我将如何选择要删除的特定标签块 -

<?xml version="1.0" encoding="UTF-8"?>
    <Document xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="urn:iso:std:iso:20022:tech:xsd:pain.001.001.03">
        <CstmrCdtTrfInitn>
            <GrpHdr>
                <MsgId>1234</MsgId>
                <CreDtTm>2021-09-03T12:35:50</CreDtTm>
                <NbOfTxs>7</NbOfTxs>
                <CtrlSum>999</CtrlSum>
                <InitgPty>
                    <Nm>TestName</Nm>
                    <Id>
                        <OrgId>
                            <Othr>
                                <Id>ABC1234</Id>
                            </Othr>
                        </OrgId>
                    </Id>
                </InitgPty>
            </GrpHdr>
            <PmtInf>
                <PmtInfId>1234</PmtInfId>
                <PmtMtd>TRF</PmtMtd>
                <BtchBookg>true</BtchBookg>
                <NbOfTxs>7</NbOfTxs>
                <CtrlSum>1234</CtrlSum>
                <PmtTpInf>
                    <InstrPrty>NORM</InstrPrty>
                    <SvcLvl>
                        <Cd>SEPA</Cd>
                    </SvcLvl>
                </PmtTpInf>
                <ReqdExctnDt>2021-09-07</ReqdExctnDt>
                <Dbtr>
                    <Nm>Test</Nm>
                    <PstlAdr>
                        <Ctry>GB</Ctry>
                        <AdrLine>TEST</AdrLine>
                        <AdrLine>Test</AdrLine>
                    </PstlAdr>
                </Dbtr>
                <DbtrAcct>
                    <Id>
                        <IBAN>1234</IBAN>
                    </Id>
                    <Ccy>EUR</Ccy>
                </DbtrAcct>
                <DbtrAgt>
                    <FinInstnId>
                        <BIC>1234</BIC>
                    </FinInstnId>
                </DbtrAgt>
                <ChrgBr>SLEV</ChrgBr>
                <CdtTrfTxInf>
                    <PmtId>
                        <InstrId>1234</InstrId>
                        <EndToEndId>1234</EndToEndId>
                    </PmtId>
                    <Amt>
                        <InstdAmt Ccy="EUR">999</InstdAmt>
                    </Amt>
                    <CdtrAgt>
                        <FinInstnId>
                            <BIC>1234</BIC>
                        </FinInstnId>
                    </CdtrAgt>
                    <Cdtr>
                        <Nm> TEST</Nm>
                        <PstlAdr>
                            <Ctry>NL</Ctry>
                            <AdrLine>33</AdrLine>
                            <AdrLine>TEST</AdrLine>
                        </PstlAdr>
                    </Cdtr>
                    <CdtrAcct>
                        <Id>
                            <IBAN>TEST</IBAN>
                        </Id>
                    </CdtrAcct>
                    <RmtInf>
                        <Ustrd>FBB</Ustrd>
                    </RmtInf>
                </CdtTrfTxInf>
                <CdtTrfTxInf>
                    <PmtId>
                        <InstrId>1234</InstrId>
                        <EndToEndId>1234</EndToEndId>
                    </PmtId>
                    <Amt>
                        <InstdAmt Ccy="EUR">1234</InstdAmt>
                    </Amt>
                    <CdtrAgt>
                        <FinInstnId>
                            <BIC>1234</BIC>
                        </FinInstnId>
                    </CdtrAgt>
                    <Cdtr>
                        <Nm> Test</Nm>
                        <PstlAdr>
                            <Ctry>NL</Ctry>
                            <AdrLine> 77</AdrLine>
                            <AdrLine>TEST</AdrLine>
                        </PstlAdr>
                    </Cdtr>
                    <CdtrAcct>
                        <Id>
                            <IBAN>1234</IBAN>
                        </Id>
                    </CdtrAcct>
                    <RmtInf>
                        <Ustrd>1234</Ustrd>
                    </RmtInf>
                </CdtTrfTxInf>
                <CdtTrfTxInf>
                    <PmtId>
                        <InstrId>1234</InstrId>
                        <EndToEndId>1234</EndToEndId>
                    </PmtId>
                    <Amt>
                        <InstdAmt Ccy="EUR">1234</InstdAmt>
                    </Amt>
                    <CdtrAgt>
                        <FinInstnId>
                            <BIC>1234</BIC>
                        </FinInstnId>
                    </CdtrAgt>
                    <Cdtr>
                        <Nm>Test.</Nm>
                        <PstlAdr>
                            <Ctry>NL</Ctry>
                            <AdrLine>Test</AdrLine>
                            <AdrLine>Test</AdrLine>
                        </PstlAdr>
                    </Cdtr>
                    <CdtrAcct>
                        <Id>
                            <IBAN>1234</IBAN>
                        </Id>
                    </CdtrAcct>
                    <RmtInf>
                        <Ustrd>1234</Ustrd>
                    </RmtInf>
                </CdtTrfTxInf>
                <CdtTrfTxInf>
                    <PmtId>
                        <InstrId>1234</InstrId>
                        <EndToEndId>1234</EndToEndId>
                    </PmtId>
                    <Amt>
                        <InstdAmt Ccy="EUR">1234</InstdAmt>
                    </Amt>
                    <CdtrAgt>
                        <FinInstnId>
                            <BIC>1234</BIC>
                        </FinInstnId>
                    </CdtrAgt>
                    <Cdtr>
                        <Nm> Test</Nm>
                        <PstlAdr>
                            <Ctry>NL</Ctry>
                            <AdrLine>Test</AdrLine>
                            <AdrLine>Test</AdrLine>
                        </PstlAdr>
                    </Cdtr>
                    <CdtrAcct>
                        <Id>
                            <IBAN>Test</IBAN>
                        </Id>
                    </CdtrAcct>
                    <RmtInf>
                        <Ustrd>Test</Ustrd>
                    </RmtInf>
                </CdtTrfTxInf>
                <CdtTrfTxInf>
                    <PmtId>
                        <InstrId>Test</InstrId>
                        <EndToEndId>Test</EndToEndId>
                    </PmtId>
                    <Amt>
                        <InstdAmt Ccy="EUR">1234</InstdAmt>
                    </Amt>
                    <CdtrAgt>
                        <FinInstnId>
                            <BIC>1234</BIC>
                        </FinInstnId>
                    </CdtrAgt>
                    <Cdtr>
                        <Nm>Test </Nm>
                        <PstlAdr>
                            <Ctry>Test</Ctry>
                            <AdrLine> 1234</AdrLine>
                            <AdrLine>Test</AdrLine>
                        </PstlAdr>
                    </Cdtr>
                    <CdtrAcct>
                        <Id>
                            <IBAN>1234</IBAN>
                        </Id>
                    </CdtrAcct>
                    <RmtInf>
                        <Ustrd>1234</Ustrd>
                    </RmtInf>
                </CdtTrfTxInf>
                <CdtTrfTxInf>
                    <PmtId>
                        <InstrId>1234</InstrId>
                        <EndToEndId>1234</EndToEndId>
                    </PmtId>
                    <Amt>
                        <InstdAmt Ccy="EUR">1234</InstdAmt>
                    </Amt>
                    <CdtrAgt>
                        <FinInstnId>
                            <BIC>1234</BIC>
                        </FinInstnId>
                    </CdtrAgt>
                    <Cdtr>
                        <Nm> Test</Nm>
                        <PstlAdr>
                            <Ctry>NL</Ctry>
                            <AdrLine>Test</AdrLine>
                            <AdrLine>Test</AdrLine>
                        </PstlAdr>
                    </Cdtr>
                    <CdtrAcct>
                        <Id>
                            <IBAN>Test</IBAN>
                        </Id>
                    </CdtrAcct>
                    <RmtInf>
                        <Ustrd>Test</Ustrd>
                    </RmtInf>
                </CdtTrfTxInf>
                <CdtTrfTxInf>
                    <PmtId>
                        <InstrId>Test</InstrId>
                        <EndToEndId>1234</EndToEndId>
                    </PmtId>
                    <Amt>
                        <InstdAmt Ccy="EUR">1234</InstdAmt>
                    </Amt>
                    <CdtrAgt>
                        <FinInstnId>
                            <BIC>1234</BIC>
                        </FinInstnId>
                    </CdtrAgt>
                    <Cdtr>
                        <Nm>Test</Nm>
                        <PstlAdr>
                            <Ctry>Test</Ctry>
                            <AdrLine>Test</AdrLine>
                            <AdrLine>Test</AdrLine>
                        </PstlAdr>
                    </Cdtr>
                    <CdtrAcct>
                        <Id>
                            <IBAN>1234</IBAN>
                        </Id>
                    </CdtrAcct>
                    <RmtInf>
                        <Ustrd>1234</Ustrd>
                    </RmtInf>
                </CdtTrfTxInf>
            </PmtInf>
        </CstmrCdtTrfInitn>
    </Document>

我基本上想删除以下标签-

               <Id>
                   <OrgId>
                      <Othr>
                         <Id>ABC1234</Id>
                      </Othr>
                   </OrgId>
              </Id>

如果您还有其他需要,请告诉我。

非常感谢,

【问题讨论】:

您不提供minimal reproducible example,使人们难以帮助您。此外,在所有有关 XSLT 的问题中,请说明您的处理器支持哪个版本的 XSLT。 感谢您的回复我已经添加了整个结构,据我所知我可以使用版本 1.0 和 2.0。 “完整”并不意味着“整个”。没有人愿意涉足 264 行代码。 【参考方案1】:

我想你可以这样做:

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:ns0="urn:iso:std:iso:20022:tech:xsd:pain.001.001.03">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>

<!-- identity transform -->
<xsl:template match="@*|node()">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
</xsl:template>

<xsl:template match="ns0:InitgPty/ns0:Id"/>

</xsl:stylesheet>

【讨论】:

【参考方案2】:

xmlstarlet:

<infile.xml xmlstarlet ed -N ns=urn:iso:std:iso:20022:tech:xsd:pain.001.001.03 \
                          -d 'ns:Document/ns:CstmrCdtTrfInitn/ns:GrpHdr/ns:InitgPty/ns:Id' > outfile.xml

【讨论】:

以上是关于如何使用 XSLT 从 XML 中删除元素标记的主要内容,如果未能解决你的问题,请参考以下文章

如何使用带有样式表和 xsltproc 的 xslt 从 xml 中删除元素?

如何使用 XSLT 从 XML 中删除名称空间

如何使用 XSLT 在 xml 文件中查找元素并将其放置在另一个标记中?

如何使用 XSLT 正确删除 XML 标记

如何使用 XSLT 从 XML 中删除货币符号?

如何从xslt输出xml中删除xmlns =“”?