我有以下 xml,并希望输出不包含 xml 声明即
从
<?xml version="1.0" encoding="UTF-8"?>
<tns:MFTRNS xmlns:tns="MFTRNS" recordState="New" msgVersion="13.0">
<OSCONO>100</OSCONO>
<OSINOU>1</OSINOU>
<OSDLIX>155379</OSDLIX>
<OSPANR>AAG44780</OSPANR>
<OSWHLO>AAG</OSWHLO>
</tns:MFTRNS>
自
<tns:MFTRNS xmlns:tns="MFTRNS" recordState="New" msgVersion="13.0">
<OSCONO>100</OSCONO>
<OSINOU>1</OSINOU>
<OSDLIX>155379</OSDLIX>
<OSPANR>AAG44780</OSPANR>
<OSWHLO>AAG</OSWHLO>
</tns:MFTRNS>
你能得到一个 xslt 来做到这一点吗,如果是的话,如何做?
这样做的原因是我想将 xml 包装在一个信封中,如果声明是 XML 的一部分,则无法完成,因为它不会创建有效的 xml 文件
谢谢
如果你只想删除声明,那么像这样简单的样式表就可以了:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml" omit-xml-declaration="yes" />
<xsl:template match="/">
<xsl:copy-of select="node()" />
</xsl:template>
</xsl:stylesheet>
但是,如果您的最终目标是"将 xml 包装在信封中",那么最好直接在 XSLT 中执行此操作,例如:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml" />
<xsl:template match="/">
<soap:Envelope xmlns:soap="http://www.w3.org/2001/12/soap-envelope">
<xsl:copy-of select="node()" />
</soap:Envelope>
</xsl:template>
</xsl:stylesheet>
这比尝试使用非 XML 感知文本操作合并这两个文件更安全。 例如,如果您的信封声明了一个默认命名空间xmlns="http://example.com"
那么只需在信封中插入另一个 XML 文档的文本就会改变语义,因为它会将非前缀元素(如 OSCONO
)移动到信封的默认命名空间中,而它们实际上应该不在命名空间中。 XSLT 将发现这种情况并添加必要的xmlns=""
重写。
很简单:您必须将xsl:output
元素的omit-xml-declaration
属性设置为 yes
。