基于节点的值从使用XSLT XML删除节点(Delete node from xml using x

2019-10-18 10:37发布

我想在这个XML文件在哪里工作我想删除基于最新的节点值的所有匹配的节点。 在下面的例子中,最新的节点值是“$ {}删除”最新节点值将始终以“$ {}删除”和节点将总是在一个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>

Answer 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>


文章来源: Delete node from xml using xslt based on node value
标签: xml xslt