当节点为空或不存在时,XPATH获取默认值

时间:2016-07-04 06:57:41

标签: xpath xpath-2.0

我有3种类型的数据

actionBar.SetDisplayShowCustomEnabled(true);

OR

<results>
   <place>
      <key>place</key>
      <value>1</value>
   </place>
</results>

OR

<results>
   <place>
      <key>place</key> // notice the missing value
   </place>
</results>

所以我的样本数据就像

<results>
</results>

我需要一个XPath表达式,当<event> <results> <place> <key>place</key> <value>1</value> </place> <some additional data here> </results> </event> <event> <results> <place> <key>place</key> </place> <some additional data here> </results> </event> <event> <results> <some additional data here> </results> </event> 的{​​{1}}存在,null或缺失时,它可以给我一个默认值。在我的第三个样本数据中提到的某些情况下,<value>也可能会丢失。

我期望的输出是<place>

XPATH 2.0解决方案也可以。我曾尝试过肆虐stackoverflow和谷歌,但无法找到任何东西。

2 个答案:

答案 0 :(得分:0)

经过大量的反复试验后,我终于做到了。

{xpath::/events/event/(results//(place|rank)/value/string(), '')[1]}

诀窍是在我的情况下升级一级,即<results>,然后使用(如果存在值,default-value)XPATH表示法。

早些时候我尝试这个失败了。 {xpath::/events/event/results//((place|rank)/value/string(), '')[1]}

希望这有助于其他人。

答案 1 :(得分:0)

使用

//results/concat(place/value, for $r in . return 'default-value'[not($r/place/value)])

基于XSLT的验证:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output method="text"/>

  <xsl:template match="/">
    <xsl:sequence select=
 "//results/concat(place/value, for $r in . return 'default-value'[not($r/place/value)])"/>
  </xsl:template>
</xsl:stylesheet>

将此转换应用于提供的(并已完成的)XML文档

<t>
    <event>
        <results>
            <place>
                <key>place</key>
                <value>1</value>
            </place>
            <x/>
        </results>
    </event>
    <event>
        <results>
            <place>
                <key>place</key>
            </place>
            <y/>
        </results>
    </event>
    <event>
        <results>
            <z/>
        </results>
    </event>
</t>

评估XPath表达式并将其结果复制到输出

1 default-value default-value