使用 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>
我可以删除 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>