XLS转换 - 忽略命名空间

时间:2017-01-05 11:16:11

标签: xml xslt

我有一个简单的XML测试

<test xmlns="urn:entsoe.eu:wgedi:ecan:totalallocationresultsdocument:6:0">
  <Domain v="old"/>
</test>

和这个XSL转换

<xsl:stylesheet version="2.0"         xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" encoding="UTF-8" indent="yes" />

    <xsl:template match="node()|@*">
         <xsl:copy>
           <xsl:apply-templates select="node()|@*"/>
         </xsl:copy>
    </xsl:template>

    <xsl:template match="Domain/@v[.='old']">
        <xsl:attribute name="v" >
            <xsl:value-of select="'New'"/>
        </xsl:attribute>
    </xsl:template>    
</xsl:stylesheet>

我需要更换&#34; Old&#34;域元素的值为&#34;新的&#34;值。如果我将删除示例xml中的xmlns标记,这是完美的工作。但是如果出现xmlns,转换不起作用。是否有任何配置参数可以忽略xmlns或任何其他方式使其工作?

由于

1 个答案:

答案 0 :(得分:1)

“xmlns”代表一个默认的命名空间声明,它不是你应该忽略的东西,而是你需要改变你的XSLT以考虑该命名空间。

在使用XSLT 2.0时,可以使用xpath-default-namespace来实现。这意味着xpath表达式中没有名称空间前缀的任何元素都将被视为它们位于指定的名称空间中。

试试这个XSLT

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xpath-default-namespace="urn:entsoe.eu:wgedi:ecan:totalallocationresultsdocument:6:0">
    <xsl:output method="xml" encoding="UTF-8" indent="yes" />

    <xsl:template match="node()|@*">
         <xsl:copy>
           <xsl:apply-templates select="node()|@*"/>
         </xsl:copy>
    </xsl:template>

    <xsl:template match="Domain/@v[.='old']">
        <xsl:attribute name="v" >
            <xsl:value-of select="'New'"/>
        </xsl:attribute>
    </xsl:template>    
</xsl:stylesheet>

编辑:如果你真的不知道名称空间是什么,你可以在XSLT 2.0中使用通配符作为名称空间前缀。

试试这个

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >
    <xsl:output method="xml" encoding="UTF-8" indent="yes" />

    <xsl:template match="node()|@*">
         <xsl:copy>
           <xsl:apply-templates select="node()|@*"/>
         </xsl:copy>
    </xsl:template>

    <xsl:template match="*:Domain/@v[.='old']">
        <xsl:attribute name="v" >
            <xsl:value-of select="'New'"/>
        </xsl:attribute>
    </xsl:template>    
</xsl:stylesheet>