如何仅删除XML的根元素的命名空间

时间:2017-04-06 03:51:53

标签: xslt xslt-1.0

我需要帮助才能使用XSLT从root元素中删除命名空间。

当前:

<?xml version="1.0" encoding="UTF-8"?>
<ns0:root xmlns:ns0="dfsafas.fsafs">
    <ns0:element1>abda</ns0:element1>
    <ns0:element2>abda</ns0:element2>
    <ns0:element3>abda</ns0:element3>
</ns0:root>

预期:

<?xml version="1.0" encoding="UTF-8"?>
<root xmlns:ns0="dfsafas.fsafs">
    <ns0:element1>abda</ns0:element1>
    <ns0:element2>abda</ns0:element2>
    <ns0:element3>abda</ns0:element3>
</root>

我有一些删除所有命名空间的解决方案,但要求仅适用于第一个元素。

这是我的XSLT-1.0方法:

<xsl:stylesheet version="1.0" xmlns:xsl="w3.org/1999/XSL/Transform">
  <xsl:output method="xml" omit-xml-declaration="yes" version="1.0" encoding="UTF-8" /> 
  <xsl:template match=""> 
   <xsl:element name="{local-name()}"> 
      <xsl:apply-templates select="@ | node()"/> 
    </xsl:element> 
  </xsl:template> 
</xsl:stylesheet>

2 个答案:

答案 0 :(得分:0)

这对你有用。请注意,现在,在元素*节点中返回命名空间的URI。

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:msxsl="urn:schemas-microsoft-com:xslt"
xmlns:ns0="dfsafas.fsafs"
exclude-result-prefixes="msxsl">
<xsl:output method="xml" omit-xml-declaration="yes" version="1.0" encoding="UTF-8" />

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

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

答案 1 :(得分:0)

尝试此操作,它将仅从根元素中删除名称空间,而不会将其复制到其他元素中。

在尝试使用Tibco Rest&Json Plugin从xml渲染json array 遇到问题后,我找到了解决方案,因此我将xml转换为仅摆脱第一个名称空间,然后对其进行渲染。 (仅保留根元素以保持xml有效和严格)

<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="*"/>

<!-- remove namespaces -->
<xsl:template match="/*">
    <xsl:element name="{local-name()}" >
        <xsl:apply-templates/>
    </xsl:element>
</xsl:template>

<!-- keep namespace of root element -->
<xsl:template match="*">
    <xsl:copy copy-namespaces="no">
        <xsl:apply-templates/>
    </xsl:copy>
</xsl:template>

</xsl:stylesheet>

对于此XML:

<?xml version = "1.0" encoding = "UTF-8"?>
<ns0:rootElement xmlns:ns0 = "http://www.tibco.com/namespaces/tnt/plugins/json">

<ns1:child xmlns:ns1="http://www.yourscheme.com">
<ns1:Name>Aviv</ns1:Name>
<ns1:Age>22</ns1:Age>
</ns1:child>

<ns1:child  xmlns:ns1="http://www.yourscheme.com">
<ns1:Name>Joe</ns1:Name>
<ns1:Age>Doe</ns1:Age>
</ns1:child>


</ns0:rootElement>

您将得到以下结果:

<rootElement>
   <ns1:child xmlns:ns1="http://www.yourscheme.com">
      <ns1:Name>Aviv</ns1:Name>
      <ns1:Age>22</ns1:Age>
   </ns1:child>
   <ns1:child xmlns:ns1="http://www.yourscheme.com">
      <ns1:Name>Joe</ns1:Name>
      <ns1:Age>Doe</ns1:Age>
   </ns1:child>
</rootElement>