我有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和谷歌,但无法找到任何东西。
答案 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