使用XSLT复制XML而不使用xml声明

时间:2013-12-18 11:18:41

标签: xslt xslt-1.0

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

由于

2 个答案:

答案 0 :(得分:2)

如果想要删除声明,那么样式表就像这样简单:

<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=""覆盖。

答案 1 :(得分:0)

这很简单:您必须将xsl:output elementomit-xml-declaration属性设置为yes