【问题标题】:xpath 1.0 set the value of non existent attributexpath 1.0 设置不存在属性的值
【发布时间】:2016-04-26 06:36:52
【问题描述】:

我有一个 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?

【问题讨论】:

  • AFAIK,我认为这不是直接可行的...您可以要求xpath返回true或false,并让您的程序逻辑相应地返回null或其他...

标签: xpath


【解决方案1】:

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

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


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

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

当应用到第三个没有OtherInfo 属性的&lt;ORDER&gt; 元素时,XPath 成功返回0,参见演示*:xpathtesterxpatheval

为了简化 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

演示:xpathtester

【讨论】:

  • 感谢 har07 看一看并帮助我。我可以使用 XSLT 来做这件事吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-11-18
  • 1970-01-01
  • 2015-09-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多