使用XSLT删除XML节点不起作用

时间:2017-10-27 07:20:18

标签: xml xslt

我有以下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"/>

我需要你的帮助来实现结果。

2 个答案:

答案 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'/>