如何复制存在/不存在特定属性的节点?附现有可用XSL代码
没问题!咱们基于你现有的XSL代码,扩展出按「属性存在/不存在」条件复制节点的功能,分两种常见场景给你详细方案:
场景1:仅复制存在指定属性的节点(同时保留原逻辑只保留该属性)
比如你想只保留带有@Ccy属性的节点,并且复制时仅保留这个属性,代码如下:
<?xml version="1.0" encoding="utf-8"?> <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output omit-xml-declaration="yes" indent="yes"/> <xsl:strip-space elements="*"/> <!-- 匹配所有带有@Ccy属性的节点,执行复制逻辑 --> <xsl:template match="node()[@Ccy]"> <xsl:copy copy-namespaces="no"> <xsl:copy-of select="@Ccy"/> <!-- 仅保留@Ccy属性 --> <xsl:apply-templates /> <!-- 递归处理子节点 --> </xsl:copy> </xsl:template> <!-- 匹配所有不带@Ccy属性的节点,空模板意味着不复制这些节点 --> <xsl:template match="node()"/> </xsl:stylesheet>
逻辑说明:
- 第一个模板用
node()[@Ccy]精准匹配带有@Ccy属性的节点,执行你原有的复制+保留属性逻辑; - 第二个通用空模板会匹配所有其他节点(不带
@Ccy的),因为没有输出逻辑,这些节点会被过滤掉。
场景2:仅复制不存在指定属性的节点
如果需求反过来,只保留不带@Ccy属性的节点,代码只需调整匹配条件:
<?xml version="1.0" encoding="utf-8"?> <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output omit-xml-declaration="yes" indent="yes"/> <xsl:strip-space elements="*"/> <!-- 匹配所有不带@Ccy属性的节点,执行复制逻辑 --> <xsl:template match="node()[not(@Ccy)]"> <xsl:copy copy-namespaces="no"> <xsl:copy-of select="@Ccy"/> <!-- 因为节点不带@Ccy,这里不会复制任何属性 --> <xsl:apply-templates /> <!-- 递归处理子节点 --> </xsl:copy> </xsl:template> <!-- 匹配所有带有@Ccy属性的节点,空模板意味着不复制这些节点 --> <xsl:template match="node()[@Ccy]"/> </xsl:stylesheet>
灵活调整提示:
- 如果要针对其他属性(比如
@Id、@Name)筛选,只需把代码中的@Ccy替换为目标属性名即可; - 要是需要修改属性保留规则(比如保留多个属性),只需调整
<xsl:copy-of select="...">的内容,比如<xsl:copy-of select="@Ccy | @Id">就能同时保留@Ccy和@Id。
内容的提问来源于stack exchange,提问作者TheUltimateHack
相关产品推荐
相关产品推荐

