6

我正在使用 XSLT 和 XML 来生成输出文档。

我在数据中拥有的内容(以我无法控制的 XML 形式)如下:

<ea type="null"/>
<pa type="null"/>
<perf>4</perf>

我需要在计算中使用这些。我看到为这些提供默认值需要对文档执行转换以提供一个有点冗长的默认值。

所以我想,在 XPath/XSLT 中是否存在三元运算,类似于 PHP:

$result = ($var == null ? true:false)

以便以下提供结果(即使它为零)

<xsl:value-of select="ea + pa + perf" />
4

5 回答 5

5

XPath 不支持条件表达式运算符。但是,如果您碰巧有 XSLT 2.0 处理器,它确实支持 if/then/else 语法。(请注意,大多数 XSLT 处理器不支持此功能)

于 2013-04-09T21:45:19.257 回答
2

使用这个 XPath 单线

sum(((ea|pa)/@type | perf)[number()= number()])

基于 XSLT 1.0 的验证

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output method="text"/>

 <xsl:template match="/*">
  <xsl:copy-of select="sum(((ea|pa)/@type | perf)[number()= number()]) "/>
 </xsl:template>
</xsl:stylesheet>

当此转换应用于以下 XML 文档(提供的片段,包装在单个顶部元素中)时:

<t>
    <ea type="null"/>
    <pa type="null"/>
    <perf>4</perf>
</t>

评估 XPath 表达式(使用顶部元素作为初始上下文节点),并将此评估的结果复制到输出:

4

如果所有元素的值都是非数字,例如:

<t>
    <ea type="null"/>
    <pa type="null"/>
    <perf>I am a string</perf>
</t>

结果再次正确:

0

请注意

当前选择的答案不包含语法上有效的 XSLT 1.0 转换,并且任何 XSLT 1.0 处理器(不是 XSLT 2.0 处理器)都会产生如下错误(使用 Saxon 6.5.4):

SAXON 6.5.4 from Michael Kay
Java version 1.6.0_31
Error at xsl:copy-of on line 12 of file:/(Untitled):
  Error in expression sum(   (     //ea[not(@type eq 'null')],     //pa[not(@type eq 'null')],     //perf[not(@type eq 'null')]   ) ) : expected ")", found "<name>"
Transformation failed: Failed to compile stylesheet. 1 error detected.
Press any key to continue . . . 
于 2013-04-10T02:19:33.160 回答
1

根据您需要的复杂程度,有几种很好的方法(第二种方法来自这里)。

方法 #1 exslt:node-set('default value') | @IfThisNodeExists表示如果第二个节点存在,则返回它的值,否则返回默认值。这实际上与 js 相同var foo='bar'; return (foo ? foo : 'default')

我可能会离开,但从我目前看到的行为来看,订单确实需要起作用,以便右侧是变量侧,因为如果双方都为真,则返回右侧。

方法 #2 如果您需要更多控制,例如当您想要返回的值和您需要评估的值不同时,那么您可能会这样做:@defaultValue[not(true_condition)] | @ValueYouNeed[true_condition]将其与exslt:node-set()技巧结合起来,以获得默认的字符串值而不是另一个节点评估。

于 2015-11-11T20:05:52.660 回答
0

这可以使用 来fn:sum(...)实现,它使您能够进行标准的 XPath 2.0 查询。它总结了一个序列中的所有数字,如果它为空,则返回 0。你所要做的就是添加所有数字元素,在你的情况下没有属性@type='null'

sum(
  (
    //ea[not(@type eq 'null')],
    //pa[not(@type eq 'null')],
    //perf[not(@type eq 'null')]
  )
)
于 2013-04-09T22:07:16.720 回答
0

抱歉,如果出现两次,今天早些时候发布的问题!

从上面看,似乎公平地说不存在用于评估表达式的三元运算符,所以我做了一个两阶段转换,一次填充空元素,然后一个执行我想要的操作。

谢谢您的回答。

于 2013-04-11T22:29:00.917 回答