根据XPATH条件返回一个字符串值

时间:2011-08-12 19:09:26

标签: xpath

如果我有以下XML,如何指定xpath以根据条件返回字符串。例如if //b[@id=23] then "Profit" else "Loss"

<a>
  <b id="23"/>
  <c></c>
  <d></d>
  <e>
    <f id="23">
       <i>123</i>
       <j>234</j>
    <f>
    <f id="24">
       <i>345</i>
       <j>456</j>
    <f>
    <f id="25">
       <i>678</i>
       <j>567</j>
    <f>
  </e>
</a>

2 个答案:

答案 0 :(得分:20)

<强>予。 XPath 2.0解决方案(如果您可以访问XPath 2.0引擎,则建议使用)

   (: XPath 2.0 has if ... then ... else ... :) 

   if(//b[@id=23]) 
     then 'Profit' 
     else 'Loss'

<强> II。 XPath 1.0解决方案:

使用:

concat(substring('Profit', 1 div boolean(//b[@id=23])),
       substring('Loss', 1 div not(//b[@id=23]))
      )

使用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(substring('Profit', 1 div boolean(//b[@id=23])),
           substring('Loss', 1 div not(//b[@id=23]))
          )"/>
 </xsl:template>
</xsl:stylesheet>

应用于提供的XML文档(已更正以使其格式正确):

<a>
    <b id="23"/>
    <c></c>
    <d></d>
    <e>
        <f id="23">
            <i>123</i>
            <j>234</j>
        </f>
        <f id="24">
            <i>345</i>
            <j>456</j>
        </f>
        <f id="25">
            <i>678</i>
            <j>567</j>
        </f>
    </e>
</a>

生成想要的正确结果

Profit

当我们替换XML文档时

<b id="23"/>

<强>与

<b id="24"/>

再次生成正确的结果

Loss

<强>解释

我们使用以下事实:

substring($someString, $N)

是所有$N > string-length($someString)的空字符串。

此外,数字Infinity是唯一一个大于任何字符串的字符串长度的数字。

最后:

根据定义,

number(true())1

根据定义,

number(false())0

因此:

1 div $someCondition

1$someCondition

时,

恰好是true()

并且Infinity恰好是$someCondition false()

因此,如果我们想要在$stringX$Cond时生成true(),并在$stringY$Cond时生成false() {1}},表达此信息的一种方法是

concat(substring($stringX, 1 div $cond),
       substring($stringY, 1 div not($cond)),
      )

在上面的表达式中,concat()函数的两个参数中只有一个是非空的

答案 1 :(得分:0)

你不能;你必须使用XQuery。见例如XQuery Conditional Expressions

或者,如果结果字符串仅在Java中使用,则只需在Java代码中处理XPath返回的值:

XPathFactory factory = XPathFactory.newInstance();
XPath xpath = factory.newXPath();
XPathExpression expr = xpath.compile("//b[@id=23]");
boolean result = expr.evaluate(doc, XPathConstants.BOOLEAN);

if (result) return "Profit";
else return "Loss";