XSLT删除与特定值

时间:2016-12-30 14:52:40

标签: xml xslt

我想从拥有它的所有元素中删除具有特定值的命名空间。我正在为它寻找XSLT转换

如下所示,我需要从包含它的元素中删除 xmlns =“NS_647”

输入XML

 <COSR xmlns="TEST_NS1" >
    <ORM_O01.PATIENT xmlns="NS_647" >
      <PID>
       <PID.1>1</PID.1>
       </PID>
     </ORM_O01.PATIENT>  
  </COSR>

输出

<COSR xmlns="TEST_NS1" >
    <ORM_O01.PATIENT >
      <PID>
       <PID.1>1</PID.1>
       </PID>
     </ORM_O01.PATIENT>  
 </COSR>

2 个答案:

答案 0 :(得分:4)

XSLT在XDM数据模型描述的节点树上运行,而不是在原始词汇XML上运行。在输入的XDM树表示中,xmlns="NS_647"不作为属性节点出现。相反,名称空间声明有两个效果:

  1. 它更改其范围内元素名称的名称空间URI部分,并
  2. 它使其范围内的所有元素都有一个命名空间节点,反映空前缀与URI的绑定&#34; NS_647&#34; (顺便说一下,不推荐使用相对URI作为命名空间名称,但我们将允许它通过)。
  3. 因此,您在转换中实际要做的是将相关元素更改为名称空间"TEST_NS1"而不是"NS_647"。您可以使用模板规则实现此目的:

    <xsl:template match="*[namespace-uri()='NS_647']">
      <xsl:element name="{local-name(.)}" namespace="TEST_NS1">
        <xsl:apply-templates select="@* | node()"/>
      </xsl:element>
    </xsl:template>
    

答案 1 :(得分:0)

试试这个xslt

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" indent="yes"/>

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

</xsl:stylesheet>