2013-07-30 170 views
1

我正尝试在这个XML文件上工作,我想根据最新的节点值删除所有匹配的节点。 在以下示例中,最新节点值为“$ {DELETE}” 最新节点值将始终为“$ {DELETE}”,并且节点将始终位于XML文件的底部。使用基于节点值的xslt从xml中删除节点

实施例:

<?xml version="1.0" encoding="utf-8" standalone="no"?> 
<projects> 
     <project id="properties1"> 
      <property name="prop1">some-value</property>  
      <property name="prop2">abc</property>    
      <property name="prop3">def</property>  
     </project> 
     <project id="properties2"> 
      <property name="prop">testing prop from pom.xml</property> 
      <property name="prop1">${DELETE}</property> 
      <property name="prop4">abc</property>  
      <property name="prop5">xyz</property> 
     </project> 
</projects> 

期望输出是:

<projects> 
     <project id="properties1">  
      <property name="prop2">abc</property>    
      <property name="prop3">def</property>  
     </project> 
     <project id="properties2"> 
      <property name="prop">testing prop from pom.xml</property> 
      <property name="prop4">abc</property>  
      <property name="prop5">xyz</property> 
     </project> 
</projects> 

回答

1

随着XSLT 2.0和XSLT 2.0处理器可以使用

<xsl:stylesheet version="2.0" exclude-result-prefixes="xs" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema"> 

    <xsl:key name="prop" match="property" use="@name"/> 

    <xsl:variable name="prop-to-delete" select="/projects/project[last()]/property[. = '${DELETE}']/@name"/> 

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

    <xsl:template match="key('prop', $prop-to-delete)"/> 

</xsl:stylesheet> 

随着XSLT 1.0则不能使用一个变量引用或路径作为匹配模式中的关键参数,所以您必须明确条件:

<xsl:stylesheet version="1.0" exclude-result-prefixes="xs" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema"> 

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

    <xsl:template match="property[@name = /projects/project[last()]/property[. = '${DELETE}']/@name]"/> 

</xsl:stylesheet> 
+0

感谢您的代码,它工作。 – phani