xpath 1.0设置不存在的属性的值

时间:2016-04-26 06:36:53

标签: xpath

我有一个xml文档

<?xml version="1.0" encoding="UTF-16"?>
<APIDATA xmlns="api-com">
<ORDER EngineID="1" OrderID="66" OtherInfo="100"><INSTSPECIFIER InstID="27" SeqID="17"/>     
</ORDER>
<ORDER EngineID="2" OrderID="67" OtherInfo="200"><INSTSPECIFIER InstID="28" SeqID="18"/>    
</ORDER>
<ORDER EngineID="3" OrderID="68"><INSTSPECIFIER InstID="29" SeqID="19"/></ORDER>
</APIDATA>

如何使用xpath获取OtherInfo属性的值 但是当它不存在时我想要Null返回

如果我使用以下xpath / APIDATA / ORDER / @ OtherInfo,我得到的输出为

100
200

但是因为对于OrderID 68,缺少OtherInfo我想要输出

100
200
0

这里有一篇贴近我的解决方案的帖子,但我不知道怎么能让它起作用 Can I create a value for a missing tag in XPath?

1 个答案:

答案 0 :(得分:0)

不幸的是,只有从给定的XML文档中只返回一个值时,对链接问题的回答方法才有效(请参阅下面有关此点的演示)。因此,鉴于此问题中发布的XML示例,简短的回答是 这不能使用纯XPath 1.0 完成。

如果在编程语言中使用XPath,一种可能的方法是使用始终返回值的XPath表达式,例如/APIDATA/ORDER。然后,对于返回的每个<ORDER>元素,通常有很多选项可以获取OtherInfo属性,并在找不到属性时提供默认值。

将链接后的方法应用于您的案例将导致以下XPath表达式:

substring(concat("0", //ORDER[3]/@OtherInfo), 2 * number(boolean(//ORDER[3]/@OtherInfo)))

XPath在应用于没有属性0的第3个<ORDER>元素时成功返回OtherInfo,请参阅演示*:xpathtester,{{ 3}}

为了简化XPath,

默认命名空间已在演示中删除

根据要求在XSLT 1.0中实现相同的方法:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:d="api-com">
  <xsl:output method="text" indent="yes"/>

  <xsl:template match="d:ORDER">
    <xsl:value-of select="substring(concat('0', @OtherInfo), 2 * number(boolean(@OtherInfo)))"/>
  </xsl:template>
</xsl:stylesheet>

输出:

100
200
0

演示:xpatheval