如何动态删除XML元素

时间:2011-09-20 06:01:45

标签: xslt

我基本上在寻找一个XSLT(比如一个可调用的模板),它将输入一个xml和一个要在XML中删除的元素,并在删除XML中的特定元素后返回最终的XML。 / p>

示例:

<Request>
  <Activity1>XYZ</Activity1>
  <Activity2>ABC</Activity2>
</Request>

现在我需要一个xslt,我必须将上面的xml作为输入,并将要删除的元素(Say <Activity1>)作为输入。删除传递给它的元素后,XSLT必须返回最终的xml。

2 个答案:

答案 0 :(得分:1)

您可以使用修改后的副本模板:

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

   <xsl:variable name="removeNode">Activity1</xsl:variable>

   <xsl:template match="node()">        
     <xsl:if test="not(name()=$removeNode)">
       <xsl:copy>
          <xsl:apply-templates select="@*|node()"/>
       </xsl:copy>
     </xsl:if>
   </xsl:template>

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

如何将参数传递给yout模板取决于您使用的XSLT处理器。

修改

另一种可能性是在需要时忽略节点:

<xsl:template match="/">
  <xsl:apply-templates select="*/*[not(self::element-to-ignore)]" 
                       mode="renderResult"/>
</xsl:template>

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

答案 1 :(得分:0)

这是一个通用转换,它接受一个全局(外部指定的)参数以及要删除的元素的名称:

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

 <xsl:param name="pDeleteName" select="'c'"/>

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

 <xsl:template match="*">
  <xsl:if test="not(name() = $pDeleteName)">
   <xsl:call-template name="identity"/>
  </xsl:if>
 </xsl:template>
</xsl:stylesheet>

应用于任何XML文档(例如以下内容):

<a>
 <b>
   <c/>
   <d>
     <e>
       <c>
         <f/>
       </c>
       <g/>
     </e>
   </d>
 </b>
</a>

生成了正确的结果 - 源XML文档中名称与pDeleteName参数中的字符串相同的任何元素 - 被删除

<a>
   <b>
      <d>
         <e>
            <g/>
         </e>
      </d>
   </b>
</a>

可以清楚地看到,元素<c>的任何出现都已被删除。