XSL - copy elements but remove unused namespace(s)

后端 未结 4 489
悲哀的现实
悲哀的现实 2020-12-30 03:56

I\'ve got some XML which declares a namespace which is only used for attributes, like this:




        
相关标签:
4条回答
  • 2020-12-30 04:09

    This will remove the x namespace from output.

    <xsl:namespace-alias result-prefix="#default" stylesheet-prefix="x" />
    

    Remember to do two things when you deal with a default namespace. First map it into something in the stylesheet tag, and then remove it using a namespace-alias.

    0 讨论(0)
  • <xsl:stylesheet 
      version="1.0"
      xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
      xmlns:x="http://tempuri.com"
      exclude-result-prefixes="x"
    >
    
      <!-- the identity template copies everything 1:1 -->
      <xsl:template match="@* | node()">
         <xsl:copy>
          <xsl:apply-templates select="@* | node()" />
        </xsl:copy>
      </xsl:template>
    
      <!-- this template explicitly cares for namespace'd attributes -->
      <xsl:template match="@x:*">
        <xsl:attribute name="{local-name()}">
          <xsl:value-of select="." />
        </xsl:attribute>
      </xsl:template>
    
    </xsl:stylesheet>
    
    0 讨论(0)
  • 2020-12-30 04:23
    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"
        xmlns:x="http://tempuri.com">
        <xsl:template match="/">
            <xsl:apply-templates select="/a/b"/>
        </xsl:template>
    
        <xsl:template match="*">
            <xsl:element name="{local-name(.)}">
                <xsl:apply-templates/>
            </xsl:element>
        </xsl:template>
    
        <xsl:template match="@*">
            <xsl:copy/>
        </xsl:template>
    
        <!-- This empty template is not needed.
    Neither is the xmlns declaration above:
        <xsl:template match="@x:*"/> -->
    </xsl:stylesheet>
    

    I found an explanation here.

    Michael Kay wrote:
    exclude-result-prefixes only affects the namespaces copied from the stylesheet by a literal result element, it doesn't affect copying of namespaces from source documents.

    0 讨论(0)
  • 2020-12-30 04:27

    Try this (note the attribute copy-namespaces='no'):

    <xsl:template match="node()">
        <xsl:copy copy-namespaces="no">
                <xsl:apply-templates select="node()"/>
        </xsl:copy>
    </xsl:template>
    
    0 讨论(0)
提交回复
热议问题