首页 > 解决方案 > XSLT 检查 xml 元素是否存在,否则跳过父元素

问题描述

如果子元素不存在,我一直在尝试跳过特定的父元素。我是 XSLT 映射的新手。如果我在某个地方出错,请纠正我。

下面是我有的xml

<element1>
    <element2>
        <element3>
            <data1>aaaa</data1>
            <data2>bbbb</data2>
            <element4>
                <data3>cccc</data3>
                <data4>dddd</data4>
            </element4>
        </element3>
    </element2>
    <element2>
        <element3>
            <data1>eeee</data1>
            <data2>ffff</data2>
        </element3>
    </element2>
</element1>

我想检查元素 4 是否存在,否则我想完全跳过元素 2。

预期结果是

<element1>
    <element2>
        <element3>
            <data1>aaaa</data1>
            <data2>bbbb</data2>
            <element4>
                <data3>cccc</data3>
                <data4>dddd</data4>
            </element4>
        </element3>
    </element2>
</element1>

我一直在尝试使用以下 xsl:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match="node()|@*">
  <xsl:copy>
   <xsl:apply-templates select="node()|@*"/>
  </xsl:copy>
 </xsl:template>

 <xsl:template match="/element1/element2[element3/element4 = '']"/>

</xsl:stylesheet>

标签: xmlxslt

解决方案


您当前的模板匹配将仅匹配一个element2如果element3/element4存在且其值为空字符串。也就是说,它会匹配这个......

<element2>
    <element3>
        <element4 />
    </element3>
</element2>

要检查存在(或不存在),您需要做的是......

<xsl:template match="/element1/element2[not(element3/element4)]"/>

推荐阅读