请求协助编写XSLT以筛选符合特定条件的XML<Test>节点
解决方案:用XSLT筛选符合条件的Test节点
没问题,我来帮你实现这个XML筛选转换的需求。下面是针对你的需求编写的XSLT代码,以及详细的逻辑说明:
完整XSLT代码
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <!-- 身份模板:默认复制所有节点和属性 --> <xsl:template match="@*|node()"> <xsl:copy> <xsl:apply-templates select="@*|node()"/> </xsl:copy> </xsl:template> <!-- 针对Test节点的筛选模板 --> <xsl:template match="Test"> <!-- 筛选条件:name以CheckType_开头,且包含value为XYZ的子节点 --> <xsl:if test="starts-with(@name, 'CheckType_') and context/value = 'XYZ'"> <xsl:copy> <xsl:apply-templates select="@*|node()"/> </xsl:copy> </xsl:if> </xsl:template> </xsl:stylesheet>
关键逻辑解释
- 身份模板:这是XSLT里的基础模板,作用是原样复制输入XML中所有未被其他模板匹配的节点和属性,保证输出XML的整体结构和原文件一致(比如外层的
TestCode、TestCategory节点都会被保留)。 - Test节点筛选模板:专门匹配所有
<Test>节点,通过<xsl:if>设置两个过滤条件:starts-with(@name, 'CheckType_'):检查Test节点的name属性是否以CheckType_开头;context/value = 'XYZ':检查该Test节点下是否存在<context>节点包含值为XYZ的<value>子节点。
只有当两个条件同时满足时,才会复制这个Test节点及其所有子内容,否则会直接过滤掉该节点。
转换验证
用你提供的输入XML运行这个XSLT后,会得到你期望的输出:
<?xml version="1.0" encoding="UTF-8"?> <TestCode version="10.0"> <TestCategory name="SmokeTest"> <Test name="CheckType_123" type="String"> <Test_description>No description available for this Test</Test_description> <context name="Testing"> <value>ABC</value> <value>XYZ</value> </context> </Test> </TestCategory> </TestCode>
完全符合你的需求:第二个Test节点因为没有XYZ的value被过滤,第三个Test节点因为name不是CheckType_开头被过滤,只保留了第一个符合条件的Test节点。
内容的提问来源于stack exchange,提问作者szpt9m
相关产品推荐
相关产品推荐

