对文字结果元素和元素构造函数方法使用单个名称空间声明
using a single namespace declaration for literal result element and element constructor methods
鉴于 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 "Avoiding duplicate namespace declarations is entirely the job of the XSLT serializer.."
但我无法利用这种洞察力来产生所需的结果。
对于包含的示例,您将获得包含的结果,因为使用 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>
鉴于 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 "Avoiding duplicate namespace declarations is entirely the job of the XSLT serializer.." 但我无法利用这种洞察力来产生所需的结果。
对于包含的示例,您将获得包含的结果,因为使用 xsl:element
生成的元素在范围内没有您在样式表元素中声明的任何名称空间,它们仅用于在特定的命名空间。从该示例中不清楚为什么您根本需要 xsl:element
并且不能简单地使用文字结果元素。
如果您确实需要使用 xsl:element
构建根元素,您可以使用 <xsl:namespace name="text" select="'urn:oasis:names:tc:opendocument:xmlns:text:1.0'"/>
构建命名空间节点。有关使用
<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>