xPath 选择性节点集



我有一个看起来像这样的文档:

<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>

相关内容

  • 没有找到相关文章

最新更新