找不到匹配项时如何让XPath返回占位符的默认值?

问题描述 投票:0回答:1

我的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不返回匹配项时,如何插入默认值?

我在做什么错?

xml xpath xpath-2.0
1个回答
1
投票

使用此XPath 2.0表达式

'[',
 string-join((/*/*/finishedSqFt/string(), 
              /*/*/bedrooms/string(), 
              (/*/*/bathrooms/string(), 'default')[1], 
              /*/*/lastSoldDate/string()), ', '),
 ']'

基于XSLT 2.0的验证

此转换:

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

应用于所提供的XML文档时:

<results>
  <result>
    <finishedSqFt>2608</finishedSqFt>
    <bedrooms>3</bedrooms>
    <totalRooms>9</totalRooms>
    <lastSoldDate>05/25/2001</lastSoldDate>
  </result>
</results>

评估上面的XPath表达式并输出该评估的结果-所需的正确结果

[ 2608, 3, default, 05/25/2001 ]

II。 XPath 1.0解决方案

concat('[ ',
        string(/*/*/finishedSqFt), ', ',
        string(/*/*/bedrooms), ', ',
        substring(string(/*/*/bathrooms), 1 div boolean(string(/*/*/bathrooms)) ),
        substring('default', 1 div not(string(/*/*/bathrooms)) ),    
        ', ',
        string(/*/*/lastSoldDate), 
        ' ]'
        )

基于XSLT 1.0的验证

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>

  <xsl:template match="/">
    <xsl:value-of select=
    "concat('[ ',
            string(/*/*/finishedSqFt), ', ',
            string(/*/*/bedrooms), ', ',
            substring(string(/*/*/bathrooms), 1 div boolean(string(/*/*/bathrooms)) ),
            substring('default', 1 div not(string(/*/*/bathrooms)) ),    
            ', ',
            string(/*/*/lastSoldDate), 
            ' ]'
            )
    "/>
  </xsl:template>
</xsl:stylesheet>

当应用于相同提供的XML文档时,会产生相同的正确结果

[ 2608, 3, default, 05/25/2001 ]

有关XPath 1.0解决方案的说明,请参见this answer

© www.soinside.com 2019 - 2024. All rights reserved.