当节点为空或不存在时,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
我有 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