XSLT生成多余命名空间问题求助,附Blueprint格式XML示例
嘿,碰到XSLT处理Blueprint XML时生成多余命名空间的问题了?我来给你几个实用的解决办法!
先把你提供的Blueprint XML代码整理一下(方便后续参考):
<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0" xmlns:cm="http://aries.apache.org/blueprint/xmlns/blueprint-cm/v1.1.0" xmlns:cxf="http://camel.apache.org/schema/blueprint/cxf" xmlns:jaxws="http://cxf.apache.org/blueprint/jaxws" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.osgi.org/xmlns/blueprint/v1.0.0 https://www.osgi.org/xmlns/blueprint/v1.0.0/blueprint.xsd http://camel.apache.org/schema/blueprint http://camel.apache.org/schema/blueprint/camel-blueprint.xsd"> <!-- 你的Blueprint内容 --> </blueprint>
常见原因&对应解决方法
1. XSLT未正确管理命名空间声明
很多时候多余命名空间是因为XSLT里没明确绑定命名空间,或者没排除不需要输出的前缀。
解决办法:在XSLT的stylesheet节点里正确声明所有用到的命名空间,并用exclude-result-prefixes排除那些不需要在结果里出现的前缀:
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:bp="http://www.osgi.org/xmlns/blueprint/v1.0.0" xmlns:cm="http://aries.apache.org/blueprint/xmlns/blueprint-cm/v1.1.0" xmlns:cxf="http://camel.apache.org/schema/blueprint/cxf" xmlns:jaxws="http://cxf.apache.org/blueprint/jaxws" exclude-result-prefixes="bp cm cxf jaxws"> <!-- 告诉XSLT别输出这些前缀的命名空间 --> <!-- 你的XSLT模板内容 --> </xsl:stylesheet>
2. 用copy/copy-of复制节点导致冗余
copy和copy-of会把原节点的所有命名空间都带过来,哪怕结果里根本用不上。
解决办法:换成xsl:element来精准创建节点,手动指定命名空间:
<!-- 比如创建一个Blueprint下的bean节点 --> <xsl:element name="bean" namespace="http://www.osgi.org/xmlns/blueprint/v1.0.0"> <xsl:attribute name="id">myCustomBean</xsl:attribute> <!-- 添加其他属性或子节点 --> </xsl:element>
这样只会在需要的节点上添加对应命名空间,不会冗余输出。
3. 移除已生成的多余命名空间
如果已经有多余命名空间出现在结果里,可以加一个通用模板来清理未使用的命名空间声明:
<xsl:template match="*"> <xsl:element name="{local-name()}" namespace="{namespace-uri()}"> <!-- 复制所有属性,但排除命名空间声明属性 --> <xsl:copy-of select="@*[not(namespace-uri()='http://www.w3.org/2000/xmlns/')]"/> <!-- 递归处理子节点 --> <xsl:apply-templates/> </xsl:element> </xsl:template>
这个模板会遍历所有节点,只保留节点本身所属的命名空间,把多余的命名空间声明属性全部去掉。
4. 精准处理xsi:schemaLocation
如果结果XML需要保留xsi:schemaLocation,别依赖复制,手动在XSLT里添加:
<xsl:attribute name="xsi:schemaLocation" namespace="http://www.w3.org/2001/XMLSchema-instance"> http://www.osgi.org/xmlns/blueprint/v1.0.0 https://www.osgi.org/xmlns/blueprint/v1.0.0/blueprint.xsd http://camel.apache.org/schema/blueprint http://camel.apache.org/schema/blueprint/camel-blueprint.xsd </xsl:attribute>
总结
核心思路就是主动管理命名空间:要么在XSLT开头明确排除不需要的前缀,要么用精准的节点创建方式避免冗余复制,必要时用模板清理已生成的多余命名空间。
内容的提问来源于stack exchange,提问作者zamek 42
相关产品推荐
相关产品推荐

