我有以下XML文件的第一行我想删除Id节点及其子节点仅在InitgPty内。
<Document xmlns="urn:iso:std:iso:20022:tech:xsd:pain.001.001.03" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<CstmrCdtTrfInitn>
<GrpHdr>
<MsgId>0001</MsgId>
<CreDtTm>2017-10-27T07:00:53</CreDtTm>
<NbOfTxs>1</NbOfTxs>
<CtrlSum>84562.00</CtrlSum>
<InitgPty>
<Nm>ABC Co</Nm>
<Id>
<OrgId />
</Id>
</InitgPty>
</GrpHdr>
经过大量阅读后,我尝试了这个XSLT,但没有运气:
<xsl:stylesheet
version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns="http://www.six-interbank-clearing.com/de/pain.001.001.03.ch.02.xsd"
xsi:schemaLocation="http://www.six-interbank-clearing.com/de/pain.001.001.03.ch.02.xsd pain.001.001.03.ch.02.xsd"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<xsl:output method="xml" version="1.0" encoding="UTF-8" standalone="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="*">
<xsl:element name="{name()}" >
<xsl:copy-of select="@*"/>
<xsl:apply-templates/>
</xsl:element>
</xsl:template>
<xsl:template match="/*">
<Document xsi:schemaLocation="http://www.six-interbank-clearing.com/de/pain.001.001.03.ch.02.xsd pain.001.001.03.ch.02.xsd">
<xsl:copy-of select="@*"/>
<xsl:apply-templates/>
</Document >
</xsl:template>
<xsl:template match="InitgPty/Id"/>
</xsl:stylesheet>
我添加了以下内容:
<xsl:template match="InitgPty/Id"/>
我需要你的帮助来实现结果。
答案 0 :(得分:1)
有一种更简单的方法可以存档,因为您也可以匹配属性。
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates/>
</xsl:copy>
</xsl:template>
<xsl template match="InitgPty/Id"/>
如果您想复制评论,请使用:
<xsl:template match="processing-instruction()">
<xsl:copy/>
</xsl:template>
编辑:尝试这个,如果上面的代码不起作用:
<xsl:template match="@*|node()">
<xsl:choose>
<xsl:when test="local-name() = 'Id' and parent::node()[local-name() = 'InitgPty']"/>
<xsl:otherwise>
<xsl:copy>
<xsl:apply-templates/>
</xsl:copy>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
答案 1 :(得分:0)
@christian的答案对我来说似乎是正确的,但是如果它不起作用请尝试使用显式前缀,例如
<xsl template match="ns:InitgPty/ns:Id" xmlns:ns='urn:iso:std:iso:20022:tech:xsd:pain.001.001.0'/>