Удалить пространство имен на элементе - PullRequest
1 голос
/ 26 сентября 2019

Я хочу удалить пространство имен в структуре вывода.Я подготовил XSLT-код, но он дает пространство имен для этого элемента

Мой входной XML-код такой.

<?xml version='1.0' encoding='UTF-8'?> 
<n0:Messages xmlns:n0="http://sap.com/xi/XI"> 
<n0:Message> 
        <ContactData>   
        <Data>
          <information>
                  <Name>A</Name>
                  <Phone>123456</Phone>   
          </information>
        </Data> 
        </ContactData> 
</n0:Message>
</n0:Messages>

XSLT-код реализован

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:n0="http://sap.com/xi/XI" exclude-result-prefixes="n0">

<!-- Output -->
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:template match="/">
     <xsl:copy-of select= "//ContactData"/>
</xsl:template>
<xsl:template match="//*">
    <xsl:element name="{local-name()}">
        <xsl:apply-templates select="@*|node()"/>
    </xsl:element>
</xsl:template>
</xsl:stylesheet>

Текущий вывод:

<?xml version='1.0' encoding='UTF-8'?>  
        <ContactData xmlns:n0="http://sap.com/xi/XI">   
        <Data>
          <information>
                  <Name>A</Name>
                  <Phone>123456</Phone>   
          </information>
        </Data> 
        </ContactData> 

Ожидаемый вывод

<?xml version='1.0' encoding='UTF-8'?>  
            <ContactData>   
            <Data>
              <information>
                      <Name>A</Name>
                      <Phone>123456</Phone>   
              </information>
            </Data> 
            </ContactData> 

Пожалуйста, помогите по этому коду Большое спасибо.

Ответы [ 2 ]

0 голосов
/ 26 сентября 2019

Если вы можете использовать XSLT 2.0 , вы можете получить требуемый результат просто:

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

<xsl:template match="/">
    <xsl:copy-of select="*/*/*" copy-namespaces="no"/>
</xsl:template>

</xsl:stylesheet>

Демо : https://xsltfiddle.liberty -development.net / 3NSSEuK


В XSLT 1.0 , требуется немного больше работы:

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

<xsl:template match="/">
    <xsl:apply-templates select="*/*/*" />
</xsl:template>

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

</xsl:stylesheet>

Демоверсия : https://xsltfiddle.liberty -development.net / 3NSSEuK / 1

0 голосов
/ 26 сентября 2019

Попробуйте, используя шаблон * и @:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:math="http://www.w3.org/2005/xpath-functions/math"
    xmlns:n0="http://sap.com/xi/XI"
    xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="xs math n0" version="1.0">

    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>

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

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

    <xsl:template match="/">
        <xsl:apply-templates select="/*:Messages/ContactData"/>
    </xsl:template>

</xsl:stylesheet>
...