如何在xsl转换时间内忽略名称空间

时间:2011-06-06 14:04:01

标签: xslt

我有一个xml如下。

<?xml version="1.0" encoding="UTF-8"?>
<books xmlns="http://www.books.com/SRK">
    <name>English</name>
</books

使用xsl进行翻译后我需要以下输出。

<?xml version="1.0" encoding="UTF-8"?>
<books>
    <name>English</name>
</books>

我需要一个xsl来忽略命名空间。我已经尝试了一些但它不能使用命名空间。

我需要你的帮助。非常感谢你的帮助。

2 个答案:

答案 0 :(得分:6)

此转化

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match="@*|node()[not(self::*)]">
  <xsl:copy/>
 </xsl:template>

 <xsl:template match="*">
  <xsl:element name="{local-name()}">
   <xsl:apply-templates select="node()|@*"/>
  </xsl:element>
 </xsl:template>
</xsl:stylesheet>

应用于提供的XML文档

<books xmlns="http://www.books.com/SRK">
    <name>English</name>
</books>

生成想要的正确结果

<books>
   <name>English</name>
</books>

答案 1 :(得分:3)

  

只有当我添加上述模板以外的其他模板时,才能使用上述模板,然后翻译完全没有工作。模板没有被执行。

可能您缺少book元素的命名空间声明。例如:

<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:b="http://www.books.com/SRK"
    exclude-result-prefixes="b">

    <xsl:output omit-xml-declaration="yes" indent="yes"/>
    <xsl:strip-space elements="*"/>

        <!-- @dimitre's answer templates -->

    <xsl:template match="b:name">
          <!-- your template for name -->
    </xsl:template>

</xsl:stylesheet>

此外,请确保使用local-name()函数来获取没有相关命名空间的元素的名称。


示例

<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:b="http://www.books.com/SRK"
    exclude-result-prefixes="b">
    <xsl:output method="xml" encoding="UTF-8" indent="yes"/>


    <xsl:template match="b:input">
        <xsl:element name="{local-name(.)}">
                <xsl:apply-templates select="b:name"/>
        </xsl:element>
    </xsl:template>

    <xsl:template match="b:name">
        <xsl:element name="{local-name()}">
            <xsl:value-of select="."/>
        </xsl:element>
            <lhs>
                <xsl:apply-templates select="following-sibling::b:lhs/b:evaluate"/>
            </lhs>
    </xsl:template>

    <xsl:template match="b:evaluate">
        Something to evaluate...    
    </xsl:template>

</xsl:stylesheet>

得到:

<?xml version="1.0" encoding="UTF-8"?>
<input>
<name>English</name>
<lhs>
        Something to evaluate...    
    </lhs>
</input>

第二个例子

您可以创建一个名为 local-identity.xsl 的单独转换,其中包含@Dimitre解决方案。然后,您可以在转换中导入它。因为你有一个命名空间,为了匹配元素你必须改变所有你的XPath,包括你将在变换中声明的前缀,如下例所示:

<xsl:stylesheet 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:brl="http://www.xyz.com/BRL"
    exclude-result-prefixes="brl"
    version="1.0">

    <xsl:import href="local-identity.xsl"/>

    <xsl:output method="xml" indent="yes"/>
    <xsl:strip-space elements="*"/>


    <xsl:template match="/brl:rule">
     <!-- do your staff, select using brl prefix -->
     <xsl:apply-templates/>
    </xsl:template>

</xsl:stylesheet>