2013-07-30 173 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