我的XML数据的一部分看起来像这样。
<results>
<result>
<finishedSqFt>2608</finishedSqFt>
<bedrooms>3</bedrooms>
<totalRooms>9</totalRooms>
<lastSoldDate>05/25/2001</lastSoldDate>
</result>
</results>
我的目标是使用单个Xpath表达式提取以下元素的字符串值数组:
[ finishedSqFt, bedrooms, bathrooms, lastSoldDate, ]
注意 bathrooms
变量未包含在我的数据中。
我正在使用的Xpath表达式如下:
(//results/result/finishedSqFt)[1] | (//results/result/bedrooms)[1] |
(//results/result/bathrooms)[1] | (//results/result/lastSoldDate)[1]
我得到的结果是:
[ 2608, 3, "05/25/2001", ]
我想要的结果是:
[ 2608, 3, "default", "05/25/2001", ]
我该如何完成?当xPath不返回匹配项时,如何插入默认值?
我在做什么错了?
答案 0 :(得分:2)
使用此XPath 2.0表达式:
where
基于XSLT 2.0的验证
此转换:
select *
from (
select
t.*,
lead(status) over(partition by id order by modified_at) lead_status
from person_updates t
) t
where status = 'INFO' and lead_status = 'UPDATE'
应用于提供的XML文档时
'[',
string-join((/*/*/finishedSqFt/string(),
/*/*/bedrooms/string(),
(/*/*/bathrooms/string(), 'default')[1],
/*/*/lastSoldDate/string()), ', '),
']'
计算上面的XPath表达式并输出该计算结果-所需的正确结果:
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:template match="/">
<xsl:sequence select=
"'[',
string-join((/*/*/finishedSqFt/string(),
/*/*/bedrooms/string(),
(/*/*/bathrooms/string(), 'default')[1],
/*/*/lastSoldDate/string()), ', '),
']'
"/>
</xsl:template>
</xsl:stylesheet>
II。 XPath 1.0解决方案
<results>
<result>
<finishedSqFt>2608</finishedSqFt>
<bedrooms>3</bedrooms>
<totalRooms>9</totalRooms>
<lastSoldDate>05/25/2001</lastSoldDate>
</result>
</results>
基于XSLT 1.0的验证:
[ 2608, 3, default, 05/25/2001 ]
应用于相同的XML文档时,会产生相同的正确结果:
concat('[ ',
string(/*/*/finishedSqFt), ', ',
string(/*/*/bedrooms), ', ',
substring(string(/*/*/bathrooms), 1 div boolean(string(/*/*/bathrooms)) ),
substring('default', 1 div not(string(/*/*/bathrooms)) ),
', ',
string(/*/*/lastSoldDate),
' ]'
)
有关XPath 1.0解决方案的说明,请参见 this answer