首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用XSL替换默认命名空间

使用XSL替换默认命名空间
EN

Stack Overflow用户
提问于 2014-11-13 08:46:33
回答 3查看 921关注 0票数 0

我原以为这会很简单,但现在我在这个问题上花了大约4个小时。我要做的就是更改这个XML的默认名称空间:

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<scenarios xmlns="http://my.url/xmlns/scenarios/v1.0.0">
    <scenarios>
        <scenario id="1" name="00_reset" active="true">
            <events>
                <sensorevent id="1" name="resetButtonEvent">
                    <sensors>
                        <sensor deviceid="46"/>
                    </sensors>
                </sensorevent>
            </events>
        </scenario>
    </scenarios>
    <systemstates>
        <systemstate id="1" default="true" name="00_visitor_reset" display="true" publish="true" type="BOOLEAN"/>
    </systemstates>
</scenarios>

"v1.0.0“应改为"v1.1.0”。但我能想到的就是:

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:old="http://my.url/xmlns/scenarios/v1.0.0" 
xmlns:new="http://my.url/xmlns/scenarios/v1.1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>
    <xsl:template match="old:*">
        <xsl:element name="{local-name()}" namespace="http://my.url/xmlns/scenarios/v1.1.0">
            <xsl:apply-templates select="@* | node()" />
        </xsl:element>
    </xsl:template>
</xsl:stylesheet>

它产生:

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?><ns0:scenarios xmlns:ns0="http://my.url/xmlns/scenarios/v1.1.0">
    <ns1:scenarios xmlns:ns1="http://my.url/xmlns/scenarios/v1.1.0">
        <ns2:scenario xmlns:ns2="http://my.url/xmlns/scenarios/v1.1.0" id="1" name="00_reset" active="true">
            <ns3:events xmlns:ns3="http://my.url/xmlns/scenarios/v1.1.0">
                <ns4:sensorevent xmlns:ns4="http://my.url/xmlns/scenarios/v1.1.0" id="1" name="resetButtonEvent">
                    <ns5:sensors xmlns:ns5="http://my.url/xmlns/scenarios/v1.1.0">
                        <ns6:sensor xmlns:ns6="http://my.url/xmlns/scenarios/v1.1.0" deviceid="46"/>
                    </ns5:sensors>
                </ns4:sensorevent>
            </ns3:events>
        </ns2:scenario>
    </ns1:scenarios>
    <ns7:systemstates xmlns:ns7="http://my.url/xmlns/scenarios/v1.1.0">
        <ns8:systemstate xmlns:ns8="http://my.url/xmlns/scenarios/v1.1.0" id="1" default="true" name="00_visitor_reset" display="true" publish="true" type="BOOLEAN"/>
    </ns7:systemstates>
</ns0:scenarios>

这并不是我真正想要的,因为唯一应该改变的是根元素中的命名空间声明。如何使用XSLT1.0将默认名称空间从http://my.url/xmlns/scenarios/v1.0.0更改为http://my.url/xmlns/scenarios/v1.1.0而不添加前缀?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-11-13 12:41:35

XSLT1.0允许XSLT处理器选择它喜欢的任何名称空间前缀,因此这个输出是一致的,但非常不友好。在XSLT2.0中,除非有冲突,否则处理器必须选择所要求的前缀,因此这个样式表应该产生所需的输出。因此,我认为您的选择是通过XSLT2.0处理器或更友好的XSLT1.0处理器运行代码。

票数 0
EN

Stack Overflow用户

发布于 2014-11-13 08:55:17

试一试

代码语言:javascript
复制
<xsl:stylesheet version="1.0" xmlns:old="http://my.url/xmlns/scenarios/v1.0.0" 
xmlns="http://my.url/xmlns/scenarios/v1.1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>
    <xsl:template match="old:*">
        <xsl:element name="{local-name()}">
            <xsl:apply-templates select="@* | node()" />
        </xsl:element>
    </xsl:template>
</xsl:stylesheet>

如果这没有帮助,那么尝试不同的XSLT1.0处理器。

票数 1
EN

Stack Overflow用户

发布于 2014-11-13 13:44:02

我现在转到Saxon作为XSLT处理器,它显示了所需的输出。我想避免额外的依赖,但似乎没有其他方法。谢谢马丁·霍宁和迈克尔·凯!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26904623

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档