xslt-2.0 - 对文字结果元素和元素构造函数方法使用单个命名空间声明
问题描述
给定 XML 源
<Content>
</Content>
和转型:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"
office:version="1.0"
xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0"
xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0">
<xsl:output indent="yes" encoding="UTF-8"/>
<xsl:template match="Content">
<xsl:element name="office:document">
<xsl:attribute name="office:version">1.2</xsl:attribute>
<xsl:attribute name="office:mimetype">application/vnd.oasis.opendocument.text</xsl:attribute>
<xsl:element name="office:body">
<xsl:element name="office:text">
<xsl:element name="text:p">Hello world.
</xsl:element>
<xsl:element name="text:p">Goodbye world.
</xsl:element>
</xsl:element>
</xsl:element>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
结果
<office:document xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0"
office:version="1.2"
office:mimetype="application/vnd.oasis.opendocument.text">
<office:body>
<office:text>
<text:p xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0">Hello world.
</text:p>
<text:p xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0">Goodbye world.
</text:p>
</office:text>
</office:body>
</office:document>
段落元素的命名空间是重复的。我希望它应用于根元素以避免这种情况,就像 odf 文件中的规范一样。
但是,如果我将名称空间添加到根元素,XSL 将包含冗余名称空间声明,用于电子表格和根元素。如果我随后从样式表元素中删除名称空间,我将无法在这些名称空间中添加文字结果元素。
我在 Kay 的第 4 版参考文献 p473 中读到“避免重复的命名空间声明完全是 XSLT 序列化程序的工作。”但我无法利用这种洞察力来产生所需的结果。
解决方案
对于包含的示例,您将获得包含的结果,因为生成的元素xsl:element
在您在样式表元素中声明的范围内没有任何名称空间,它们仅用于在某个名称空间中创建元素。从该示例中不清楚为什么您需要xsl:element
并且不能简单地使用文字结果元素。
如果您确实需要使用 构造根元素xsl:element
,则可以使用 构造名称空间节点<xsl:namespace name="text" select="'urn:oasis:names:tc:opendocument:xmlns:text:1.0'"/>
。请参阅https://xsltfiddle.liberty-development.net/jyH9rMg以获取在线示例,该示例使用
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"
office:version="1.0"
xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0"
xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0">
<xsl:output indent="yes" encoding="UTF-8"/>
<xsl:template match="Content">
<xsl:element name="office:document">
<xsl:namespace name="text" select="'urn:oasis:names:tc:opendocument:xmlns:text:1.0'"/>
<xsl:attribute name="office:version">1.2</xsl:attribute>
<xsl:attribute name="office:mimetype">application/vnd.oasis.opendocument.text</xsl:attribute>
<xsl:element name="office:body">
<xsl:element name="office:text">
<xsl:element name="text:p">Hello world.
</xsl:element>
<xsl:element name="text:p">Goodbye world.
</xsl:element>
</xsl:element>
</xsl:element>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
进入
<office:document xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0"
xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0"
office:version="1.2"
office:mimetype="application/vnd.oasis.opendocument.text">
<office:body>
<office:text>
<text:p>Hello world.
</text:p>
<text:p>Goodbye world.
</text:p>
</office:text>
</office:body>
</office:document>
推荐阅读
- react-native - 当我完成裁剪图像而没有任何错误日志时,应用程序会自动崩溃。我使用了世博会图像选择器
- go - 不同连接上不同主机之间的TCP连接
- sqlite - 根据记录的关联表中存在的值检索记录
- asp.net-core - 使用 .NET Core 通过 Sustainsys 进行 SAML2 登录的多个 IDP
- java - 向 PC 未安装 Java 的用户发送 Java 程序
- jenkins - 在 Jenkins Execute Shell 脚本块中转义单引号
- python - How to specify status code in Google Cloud Function response?
- python-3.x - cron 是否监视作业的退出代码,我有一个正在重新启动的 cron 作业
- c - 我正在尝试用 c 语言读取文件,文件结构在数组中,我必须将它分成数组 x[] 和 y[]
- python - 获取 Django - [Errno 111] 连接被拒绝错误