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

XPATH get default value when node is empty or not present

我有 3 种类型的数据

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

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

<results>
</results>

所以我的样本数据会像

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

我需要一个 XPath 表达式,它可以在 <place><value> 存在、为空或缺失时为我提供默认值。 <place> 在某些情况下也可能会丢失,如我的第三个样本数据中所述。

我在这里期望的输出是 1, <default-value>, <default-value>

XPATH 2.0 解决方案也可以使用。我试过搜索 Whosebug 和 google 但找不到任何东西。

经过反复试验,我终于做到了。

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

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

早些时候,我尝试过这个失败。

{xpath::/events/event/results//((place|rank)/value/string(), '')[1]}
采用:
//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