如何使用 XSLT 删除 XML 文件中节点的部分属性



>我有以下xml代码:

<OML>    
  <bg-def xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" name="EX1"/>
</OML>

我想使用 XSLT 删除属性 xmlns:xsi 及其值,以便结果如下所示:

<OML>    
  <bg-def name="EX1"/>
</OML>

我尝试使用以下 XSLT 代码执行此操作:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
 <xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" 
xmlns:ex="http://exslt.org/dates-and-times" extension-element-prefixes="ex">
 <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="no"  xml:space="preserve"/>
<xsl:template match="node()|@*">
    <xsl:copy>
        <xsl:apply-templates select="node()|@*"/>
    </xsl:copy>
</xsl:template>
<xsl:template match="bg-def|@ xmlns:xsi"/>
</xsl:transform>

在我写完代码之前,我的编辑警告我:"W 命名空间前缀 xmlns 尚未声明"。当我删除表达式 :xsi 并只编写 xmlns 时,没有更多的警告。但是当我编译和执行我的程序时,没有任何反应,我没有得到预期的输出。我还尝试用这个更改我的 xslt 文件的最后一行:

<xsl:template match="bg-def|@ name"/>

那么结果看起来像这样:

<OML>    
  <bg-def xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"/>
</OML>

这意味着,属性名称已被很好地删除。但我想用属性 xmlns:xsi 来做到这一点。有人可以帮我这样做吗?感谢您的任何帮助。法兰基

bd-def 节点使用以下模板:

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

而不是

<xsl:template match="bg-def|@ name"/>

此模板将创建节点 bg-def 并复制所有上下文节点和属性,但不会复制命名空间

检查类似问题:删除特定元素的命名空间

更新:

源文件:

<OML>    
     <bg-def xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" name="EX1"/>
</OML>

样式表:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" 
    xmlns:ex="http://exslt.org/dates-and-times" extension-element-prefixes="ex">
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="no" xml:space="preserve"/>
    <xsl:template match="node()|@*">
        <xsl:copy>
            <xsl:apply-templates select="node()|@*"/>
        </xsl:copy>
    </xsl:template>
    <xsl:template match="bg-def">
        <xsl:element name="{local-name()}">
            <xsl:apply-templates select="node()|@*"/>
        </xsl:element>
    </xsl:template>
</xsl:transform>

转换结果 (撒克逊 6.5.5 - Xslt 1.0):

<?xml version="1.0" encoding="UTF-8"?><OML>    
     <bg-def name="EX1"/>
</OML>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml"/>
<xsl:template match="*">
    <xsl:element name="{local-name()}">
      <xsl:apply-templates select="@*"/>
      <xsl:apply-templates/>
    </xsl:element>
</xsl:template>
<xsl:template match="@*">
    <xsl:attribute name="{local-name()}">
      <xsl:value-of select="."/>
    </xsl:attribute>
</xsl:template>
</xsl:stylesheet>

相关内容

  • 没有找到相关文章

最新更新