我有一个看起来像这样的文档:
<test>
<testOne>
<testTwo>AAA</testTwo>
<testOne>
<testOne>
<testTwo>BBB</testTwo>
<testOne>
<testOne>
<testTwo>CCC</testTwo>
<testOne>
<testOne>
<testTwo>DDD</testTwo>
<testOne>
<testOne>
<testTwo>EEE</testTwo>
<testOne>
</test>
现在在 xsl 中,通过执行以下操作很容易获得此节点集:
<xsl:variable name="testOnes" select="//test/testOne">
但是,我遇到的问题是,我必须满足一些条件才能形成节点集,例如
if testOne[testTwo='AAA'] exists select all nodes except those of form testOne[testTwo='BBB']
and if testOne[testTwo='CCC'] exists then select all nodes except those of form testOne[testTwo='DDD']
因此,例如,根据上面的规则,我们应该从任何特定的 xpath 中获取此结果:
<test>
<testOne>
<testTwo>AAA</testTwo>
<testOne>
<testOne>
<testTwo>CCC</testTwo>
<testOne>
<testOne>
<testTwo>EEE</testTwo>
<testOne>
</test>
有没有办法编写带有 if 语句的 xpath 来实现这个或一些 xsl 代码,可以检查节点集内容并在找到另一个节点时删除一个节点?
如果 testOne[testTwo='AAA'] 存在,则选择除表单节点之外的所有节点 testOne[testTwo='BBB']
此条件可以重新表述如下:
选择所有测试满足以下任一条件的两个节点:
1. 它们的值不是"BBB"
2. 他们没有"表亲"测试值为"AAA"的两个节点
或者,在另一种表述中:
选择所有测试两个不满足这两个节点:
1. 它们的值是"BBB"
2. 他们有一个"表亲"测试两个节点,值为"AAA"
在 XPath 中可以写成:
//testTwo[not(.='BBB' and ../../testOne/testTwo='AAA')]
以以下形式添加另一个谓词:
//testTwo[not(.='BBB' and ../../testOne/testTwo='AAA')]
[not(.='DDD' and ../../testOne/testTwo='CCC')]
生成一个表达式,在您的示例中,该表达式将选择:
<testTwo>AAA</testTwo>
<testTwo>CCC</testTwo>
<testTwo>EEE</testTwo>