XSLT技术需求:按元素子值删除节点并移除List元素
解决方案
需求1:删除指定的<Value>元素
通过XSLT的身份模板(默认复制所有节点)加上针对性的排除规则就能实现。先定义一个键(key)快速定位<List>中DisplayOrNo值为no的ElementID,提升匹配效率。
示例XSLT(仅完成需求1)
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <!-- 定义键:匹配DisplayOrNo为no的Element的ID --> <xsl:key name="hidden-elements" match="List/Element[MetaData/Value[@AttributeID='DisplayOrNo']='no']" use="@ID"/> <!-- 身份模板:默认复制所有节点和属性 --> <xsl:template match="@*|node()"> <xsl:copy> <xsl:apply-templates select="@*|node()"/> </xsl:copy> </xsl:template> <!-- 排除Products中对应隐藏ElementID的Value元素 --> <xsl:template match="Products/Product/Values/Value[key('hidden-elements', @ElementID)]"/> </xsl:stylesheet>
效果说明
该XSLT会保留原XML的所有内容,仅删除<Products>/<Product>/<Values>下ElementID匹配<List>中DisplayOrNo为no的<Value>元素,与你给出的预期结果完全一致。
需求2:同时移除整个<List>元素
完全可以在同一个XSLT里完成,不需要编写第二个。只需在上述基础上,新增一个模板跳过<List>元素的复制即可。
完整XSLT(同时满足两个需求)
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <!-- 定义键:匹配DisplayOrNo为no的Element的ID --> <xsl:key name="hidden-elements" match="List/Element[MetaData/Value[@AttributeID='DisplayOrNo']='no']" use="@ID"/> <!-- 身份模板:默认复制所有节点和属性 --> <xsl:template match="@*|node()"> <xsl:copy> <xsl:apply-templates select="@*|node()"/> </xsl:copy> </xsl:template> <!-- 排除Products中对应隐藏ElementID的Value元素 --> <xsl:template match="Products/Product/Values/Value[key('hidden-elements', @ElementID)]"/> <!-- 移除整个<List>元素 --> <xsl:template match="List"/> </xsl:stylesheet>
效果说明
这个XSLT会先执行需求1的删除操作,同时直接跳过<List>元素的复制,最终输出就是你想要的不含<List>且已清理指定<Value>的XML。
内容的提问来源于stack exchange,提问作者patrick
相关产品推荐
相关产品推荐

