基于XSLT筛选指定ValidationScenario并移除特定Validation元素求助
问题解决:通过XSLT移除指定节点下的特定元素
我有一份XML文件,需通过XSLT对其进行更新:筛选出name为“ABC test”的validationscenario节点,仅从该节点的validations中移除abc_name为“data_005”和“data_006”的validation元素,不得改动“XYZ test”节点下的内容。
输入XML
<?xml version="1.0" encoding="UTF-8"?> <config xmlns="http://abcxyz.com/abc/config" version="0.37"> <validationscenarios> <validationscenarioslist> <validationscenario> <name>ABC test</name> <validations> <validation abc_name="data_001" levels="1"/> <validation abc_name="data_002" levels="2.4"/> <validation abc_name="data_003" levels="6.0"/> <validation abc_name="data_004" levels="4.0"/> <validation abc_name="data_005" levels="2,3"/> <validation abc_name="data_006" levels="3.5,4.5"/> </validations> </validationscenario> <validationscenario> <name>XYZ test</name> <validations> <validation abc_name="data_001" levels="3.5"/> <validation abc_name="data_002" levels="5.5"/> <validation abc_name="data_005" levels="6.5"/> <validation abc_name="data_006" levels="4.5"/> </validations> </validationscenario> </validationscenarioslist> </validationscenarios> </config>
我编写的不完整XSLT脚本
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:cc="http://abcxyz.com/abc/config" xmlns="http://abcxyz.com/abc/config" version="1.0"> <xsl:output method="xml" encoding="utf-8" indent="yes" omit-xml-declaration="no" standalone="no"/> <xsl:strip-space elements="*"/> <xsl:template match="@*|node()|comment()"> <xsl:copy> <xsl:apply-templates select="@*|node()|comment()"/> </xsl:copy> </xsl:template> <xsl:template match=" /cc:config/cc:validationscenarios/cc:validationscenarioslist/cc:validationscenario/cc:name[contains(.,'ABC test')]"> // not working here //cc:validations/cc:validation[@abc_name='data_005'] // </xsl:transform>
完整解决方案XSLT
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:cc="http://abcxyz.com/abc/config" xmlns="http://abcxyz.com/abc/config" version="1.0"> <xsl:output method="xml" encoding="utf-8" indent="yes" omit-xml-declaration="no" standalone="no"/> <xsl:strip-space elements="*"/> <!-- 身份转换模板:默认复制所有节点、属性和注释 --> <xsl:template match="@*|node()|comment()"> <xsl:copy> <xsl:apply-templates select="@*|node()|comment()"/> </xsl:copy> </xsl:template> <!-- 移除指定条件的validation节点:仅匹配ABC test场景下的data_005和data_006 --> <xsl:template match="cc:validationscenario[cc:name = 'ABC test']/cc:validations/cc:validation[@abc_name='data_005' or @abc_name='data_006']"/> </xsl:transform>
方案说明
- 身份转换模板:保留原有逻辑,确保XML中未被特殊匹配的所有内容都原样复制,保证其他节点(比如XYZ test下的所有元素)不受影响。
- 移除模板:精准匹配需要删除的节点:
- 先定位到
name为“ABC test”的validationscenario节点 - 再找到该节点下
validations中的validation元素 - 筛选出
abc_name属性为“data_005”或“data_006”的元素,由于模板内没有任何输出逻辑,这些节点会被直接跳过,实现移除效果。
- 先定位到
内容的提问来源于stack exchange,提问作者Aashish
相关产品推荐
相关产品推荐

