使用 XSLT 复制不带 xml 声明的 XML



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

相关内容

  • 没有找到相关文章