How to replace namespace prefix in element and attributes using xslt

后端 未结 1 1537
南方客
南方客 2021-01-21 09:30

I have a source xml like following:



        
相关标签:
1条回答
  • 2021-01-21 10:29

    There are two problems in your XSLT. Firstly, where you match the s1 and s2 elements, you are not subsequently trying to apply templates to any attributes. You need to replace this statement

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

    With this statement

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

    Secondly, you don't have any templates to match such attributes. You need a template like so:

    <xsl:template match="@s1:*">
        <xsl:attribute name="t1:{local-name()}">
            <xsl:value-of select="." />
        </xsl:attribute>
    </xsl:template>
    

    Try this XSLT

    <xsl:stylesheet version="1.0" 
       xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
       xmlns="http://sample.com/s" 
       xmlns:s1="http://sample.com/s1" 
       xmlns:s2="http://sample.com/s2" 
       xmlns:t1="http://sample.com/t1" 
       xmlns:t2="http://sample.com/t2" 
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
       xmlns:xs="http://www.w3.org/2001/XMLSchema" 
       exclude-result-prefixes="s1 s2">
    
       <xsl:output method="xml" encoding="UTF-8" indent="yes"/>
    
       <xsl:strip-space elements="*"/>
    
       <xsl:template match="/">
          <SampleRequest 
            xmlns="http://sample.com/t" 
            xmlns:t1="http://sample.com/t1" 
            xmlns:t2="http://sample.com/t2" 
            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
             <xsl:attribute name="xsi:schemaLocation">http://sample.com/t targetSchema.xsd</xsl:attribute>
             <xsl:copy>
                <xsl:apply-templates select="@* | node()"/>
             </xsl:copy>
          </SampleRequest>
       </xsl:template>
    
       <xsl:template match="s1:*">
          <xsl:element name="t1:{local-name()}">
             <xsl:apply-templates select="@* | node()"/>
          </xsl:element>
       </xsl:template>
    
       <xsl:template match="@s1:*">
          <xsl:attribute name="t1:{local-name()}">
             <xsl:value-of select="."/>
          </xsl:attribute>
       </xsl:template>
    
       <xsl:template match="s2:*">
          <xsl:element name="t2:{local-name()}">
             <xsl:apply-templates select="@* | node()"/>
          </xsl:element>
       </xsl:template>
    
       <xsl:template match="@s2:*">
          <xsl:attribute name="t2:{local-name()}">
             <xsl:value-of select="."/>
          </xsl:attribute>
       </xsl:template>
    </xsl:stylesheet>
    

    When applied to your sample XML, the following is output:

    <SampleRequest 
       xsi:schemaLocation="http://sample.com/t targetSchema.xsd" 
       xmlns:t1="http://sample.com/t1" 
       xmlns:t2="http://sample.com/t2" 
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
       xmlns:xs="http://www.w3.org/2001/XMLSchema" 
       xmlns="http://sample.com/t">
       <t1:customer t1:firstName="Jim" t1:lastName="Ellison"/>
       <t2:address> 123 test street </t2:address>
    </SampleRequest>
    
    0 讨论(0)
提交回复
热议问题