如果我有以下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>
答案 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";