使用XSLT在不使用XML声明的情况下复制XML

使用XSLT在不使用XML声明的情况下复制XML,xslt,xslt-1.0,Xslt,Xslt 1.0,我有以下xml,希望输出不包含xml声明 i、 e 从 100 1. 155379 AAG44780 AAG 到 100 1. 155379 AAG44780 AAG 你能用xslt来做这件事吗?如果可以的话,怎么做 这样做的原因是,我想将xml封装在一个信封中,如果声明是xml的一部分,则无法这样做,因为它不会创建有效的xml文件 谢谢这很简单:您必须将的省略xml声明属性设置为是如果您只想删除声明,那么像这样简单的样式表就可以了: <xsl:stylesheet xmlns:x

我有以下xml,希望输出不包含xml声明 i、 e


100
1.
155379
AAG44780
AAG


100
1.
155379
AAG44780
AAG
你能用xslt来做这件事吗?如果可以的话,怎么做

这样做的原因是,我想将xml封装在一个信封中,如果声明是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: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>
<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>