使用 XSLT 删除 XML 中的父节点

Removing parent node in XML using XSLT

我可以删除 XML 中的父节点,但空格仍然存在,我看到一些硬代码也被删除了。

我的XML

<?xml version="1.0" encoding="UTF-8"?>
<EDIDATA>
   <MetaData>
      <Sender>NCBK</Sender>
      <MessageType>ABCDE</MessageType>
      <TranType>INT</TranType>
      <ValueDate>220427</ValueDate>
      <CorpReferenceNumber>0000JF4HHwBHLcKD</CorpReferenceNumber>
      <ExecutionDate>2204271029</ExecutionDate>
      <AccountNumber>08563275789</AccountNumber>
      <Status>OK</Status>
      <DeliveryStatus>OK</DeliveryStatus>
      <MessageDescription>Credit Notification</MessageDescription>
      <SequenceNumber>220400100000305</SequenceNumber>
      <TransactionReference>100000305</TransactionReference>
      <ErrorDescription>-</ErrorDescription>
      <Account>20817167000105</Account>
      <TimeStamp>2022-04-27T10:28:01</TimeStamp>
   </MetaData>
   <Payload><![CDATA[]]></Payload>
</EDIDATA>

我的输出低于:

<?xml version="1.0" encoding="UTF-8"?>
<EDIDATA> **Getting space below EDIDATA:**
   <Sender>NCBK</Sender>
   <MessageType>CRNTF</MessageType>
   <TranType>INT</TranType>
   <ValueDate>220427</ValueDate>
   <CorpReferenceNumber>8HplxF4HHwBHLcKD</CorpReferenceNumber>
   <ExecutionDate>2204271029</ExecutionDate>
   <AccountNumber>20817167000105</AccountNumber>
   <Status>OK</Status>
   <DeliveryStatus>OK</DeliveryStatus>
   <MessageDescription>Credit Notification</MessageDescription>
   <SequenceNumber>220427100000305</SequenceNumber>
   <TransactionReference>100000305</TransactionReference>
   <ErrorDescription>-</ErrorDescription>
   <Account>20817167000105</Account>
   <TimeStamp>2022-04-27T10:28:01</TimeStamp> **Getting space below TimeStamp:**
   <Payload /> **Payload is empty after xslt**
</EDIDATA>

使用下面的 xslt:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
   <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes" />
   <xsl:template match="*">
      <xsl:element name="{local-name(.)}">
         <xsl:apply-templates select="@* | node()" />
      </xsl:element>
   </xsl:template>
   <xsl:template match="MetaData">
      <xsl:apply-templates />
   </xsl:template>
</xsl:stylesheet>

谁能建议这里需要更正的地方:

要去除多余的白色space,可以添加这条指令:

<xsl:strip-space elements="*"/>

到样式表的顶层。


仅供参考,Payload 元素在原始 XML 中也是空的。如果您希望 Payload 继续使用 CDATA 作为其文本,您应该将 xsl:output 指令更改为:

<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes" cdata-section-elements="Payload"/>

但我怀疑您的处理器在没有实际文本的情况下会费心去实现它。


P.S。我不明白你为什么需要使用:

<xsl:element name="{local-name(.)}">

而不是:

<xsl:copy>