【问题标题】:Delete node from xml using xslt based on node value使用基于节点值的 xslt 从 xml 中删除节点
【发布时间】:2013-07-30 14:53:07
【问题描述】:

我正在尝试处理这个 XML 文件,我想根据最新的节点值删除所有匹配的节点。 在以下示例中,最新的节点值为“${DELETE}” 最新的节点值将始终为“${DELETE}”,并且该节点将始终位于 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>

【问题讨论】:

    标签: xml xslt


    【解决方案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>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-18
      • 1970-01-01
      • 2015-08-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多