首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用<xsl:copy->从XSLT2.0中的输入XML中删除名称空间?

如何使用<xsl:copy->从XSLT2.0中的输入XML中删除名称空间?
EN

Stack Overflow用户
提问于 2020-07-07 17:54:18
回答 1查看 443关注 0票数 0

我试图使用xsl:copy-of函数将一个节点从输入XML复制到输出XML。我使用copy-namespaces="no"模式来避免复制输入名称空间。但是在产品标记中仍然有一个默认的名称空间被复制为xmlns=""

我的问题是:

如何使用xsl:copy-of函数删除这些默认名称空间?此外,如何从子节点中移除名称空间。

输入XML:

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<ns:result xmlns:ns="http://example.com">
   <product ku="00001">
      <ku>00001</ku>
      <custom-attributes>
         <custom-attribute xmlns:dt="http://example.com-dt" dt:dt="string" name="Instrument" />
      </custom-attributes>
   </product>
   <product ku="00002">
      <ku>00002</ku>
      <custom-attributes>
         <custom-attribute xmlns:dt="http://example.com-dt" dt:dt="string" name="Instrument">
            <value>112</value>
         </custom-attribute>
      </custom-attributes>
   </product>
</ns:result>

XSLT:

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"  xmlns:t="http://test.com/dataservice/dop" xmlns:fc="http://example.com" exclude-result-prefixes="t fc ">
    <xsl:output indent="yes" encoding="UTF-8"/>
    <xsl:template match="*">
        <final xmlns="http://www.example.com/ns/core/tetrex"
            xmlns:dt="http://www.example.com/ns/core/tetrex-dt"
            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" branch="enterprise" build="4.0.5"
            family="fine" major="6" minor="1"
            xsi:schemaLocation="http://www.example-dt.com dt.xsd">
            <xsl:for-each select="//fc:result/product">
                <xsl:copy-of select="current()" copy-namespaces="no"  />
            </xsl:for-each>
        </final>
    </xsl:template>
</xsl:stylesheet>

当前输出XML:

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<final xmlns="http://www.example.com/ns/core/tetrex"
       xmlns:dt="http://www.example.com/ns/core/tetrex-dt"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       branch="enterprise"
       build="4.0.5"
       family="fine"
       major="6"
       minor="1"
       xsi:schemaLocation="http://www.example-dt.com dt.xsd">
   <product xmlns="" ku="00001">
      <ku>00001</ku>
      <custom-attributes>
         <custom-attribute xmlns:dt="http://example.com-dt" dt:dt="string" name="Instrument"/>
      </custom-attributes>
   </product>
   <product xmlns="" ku="00002">
      <ku>00002</ku>
      <custom-attributes>
         <custom-attribute xmlns:dt="http://example.com-dt" dt:dt="string" name="Instrument">
            <value>112</value>
         </custom-attribute>
      </custom-attributes>
   </product>
</final>

期望输出:

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<final xmlns="http://www.example.com/ns/core/tetrex"
       xmlns:dt="http://www.example.com/ns/core/tetrex-dt"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       branch="enterprise"
       build="4.0.5"
       family="fine"
       major="6"
       minor="1"
       xsi:schemaLocation="http://www.example-dt.com dt.xsd">
   <product ku="00001">
      <ku>00001</ku>
      <custom-attributes>
         <custom-attribute dt:dt="string" name="Instrument"/>
      </custom-attributes>
   </product>
   <product ku="00002">
      <ku>00002</ku>
      <custom-attributes>
         <custom-attribute dt:dt="string" name="Instrument">
            <value>112</value>
         </custom-attribute>
      </custom-attributes>
   </product>
</final>
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-07-07 23:34:00

您显示的输出可以通过应用以下样式表获得:

XSLT2.0

代码语言:javascript
复制
<xsl:stylesheet version="2.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"  
xpath-default-namespace="http://example.com"
xmlns="http://www.example.com/ns/core/tetrex"
xmlns:dt="http://example.com-dt"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" >
<xsl:output method="xml" version="1.0" encoding="utf-8" indent="yes"/>

<xsl:template match="/result">
    <final
        branch="enterprise" 
        build="4.0.5"
        family="fine" 
        major="6" 
        minor="1"
        xsi:schemaLocation="http://www.example-dt.com dt.xsd">
        <xsl:apply-templates/>
    </final>
</xsl:template>

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

</xsl:stylesheet>

请注意,这并不是“从输入XML中删除名称空间”。相反,它接受输入XML中没有命名空间中的元素,并将它们放置在http://www.example.com/ns/core/tetrex名称空间中,这是输出XML的默认名称空间。

Demohttps://xsltfiddle.liberty-development.net/ehW12fF

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62781171

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档