XSLT通过xsl:output元素控制XML声明输出,核心属性包括omit-xml-declaration、method、version、encoding和indent;其中omit-xml-declaration="no"可确保声明输出,encoding建议设为UTF-8以支持多语言字符;XSLT 2.0及以上版本还可通过xsl:result-document为每个输出文件独立设置这些属性,实现对多个文档XML声明的灵活控制。

XSLT要输出XML声明,核心在于
xsl:output
omit-xml-declaration
method
xml
XSLT中输出XML声明的关键在于
xsl:output
omit-xml-declaration="no"
version
encoding
一个典型的例子会是这样:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<!-- 明确指示输出XML声明,版本为1.0,编码为UTF-8 -->
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes" omit-xml-declaration="no"/>
<xsl:template match="/">
<root>
<item id="1">Hello, XSLT!</item>
<item id="2">这是一个测试。</item>
</root>
</xsl:template>
</xsl:stylesheet>这段XSLT会生成一个包含XML声明的XML文档,例如:
<?xml version="1.0" encoding="UTF-8"?> <root> <item id="1">Hello, XSLT!</item> <item id="2">这是一个测试。</item> </root>
如果你想完全抑制XML声明的输出,只需将
omit-xml-declaration
yes
我个人觉得,要真正掌握XSLT的输出,
xsl:output
omit-xml-declaration
首先是
method
xml
html
text
然后是
version
version
version="1.0"
version="1.1"
接着是
encoding
UTF-8
UTF-16
ISO-8859-1
encoding
最后,
indent
yes
no
这些属性共同协作,为我们提供了对XSLT输出结果的强大控制力。
在处理多语言或包含特殊字符的XML时,确保XML声明中的
encoding
首先,最稳妥的策略是始终使用
UTF-8
encoding="UTF-8"
然而,仅仅设置
encoding="UTF-8"
xsl:text
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes" omit-xml-declaration="no"/>
<!-- ... -->
</xsl:stylesheet>此外,还要注意输入XML文档的编码。XSLT处理器会根据输入XML文档的XML声明来解析它。如果输入文档的声明与实际编码不符,或者缺少声明导致处理器猜测错误,那么在转换过程中,字符就已经被错误地解释了,即使你输出时指定了正确的编码,结果也可能已经是乱码了。这就像是源头的水就被污染了,下游怎么净化都无济于事。
所以,一个完整的流程应该是:
<?xml version="1.0" encoding="UTF-8"?>
xsl:output
encoding="UTF-8"
遵循这些步骤,可以大大降低在多语言环境下遇到编码问题的风险。
当我们谈到XSLT输出XML声明时,通常是在处理单个输出文档的场景下。但在XSLT 2.0(以及后续的3.0)中,引入了一个非常强大的特性:
xsl:result-document
在XSLT 1.0中,
xsl:output
omit-xml-declaration
version
encoding
xsl:result-document
xsl:output
xsl:result-document
例如,假设我们要根据输入XML中的不同部分,生成两个不同的XML文件:一个主文件带声明,一个子文件不带声明。
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<!-- 全局默认输出设置,例如主文档 -->
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes" omit-xml-declaration="no"/>
<xsl:template match="/data">
<!-- 生成主文档,会使用全局的xsl:output设置,即带声明 -->
<main_report>
<xsl:apply-templates select="item[@type='main']"/>
</main_report>
<!-- 生成一个子文档,不带XML声明 -->
<xsl:result-document href="sub_data.xml" omit-xml-declaration="yes" encoding="UTF-8" indent="yes">
<sub_report>
<xsl:apply-templates select="item[@type='sub']"/>
</sub_report>
</xsl:result-document>
</xsl:template>
<xsl:template match="item">
<entry id="{@id}">
<value><xsl:value-of select="."/></value>
</entry>
</xsl:template>
</xsl:stylesheet>在这个例子中,主输出文档(通常是标准输出或默认输出文件)会带有XML声明,因为它遵循了顶层
xsl:output
omit-xml-declaration="no"
xsl:result-document
sub_data.xml
xsl:result-document
omit-xml-declaration="yes"
这种能力极大地提升了XSLT在处理复杂文档生成任务时的实用性。它让我们可以根据每个输出文件的具体用途和接收系统的要求,精细化地控制其格式和元数据,避免了不必要的后处理步骤,使得整个转换流程更加高效和内聚。这确实是XSLT 2.0+版本中一个非常值得称赞的进步。
以上就是XSLT如何输出XML声明?的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号