XSLT三元“如果”运营商?

时间:2013-04-09 21:39:15

标签: xpath xslt-1.0

我正在使用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" />

5 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:1)

使用此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表达式(使用top元素作为初始上下文节点),并将此评估的结果复制到输出中:

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 . . . 

答案 2 :(得分: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')]
  )
)

答案 3 :(得分:0)

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

从上面看,似乎可以说没有用于evalutaing表达式的三元运算符,所以我做了一个两阶段变换,一次填充空元素,然后一个执行我想要的操作。

感谢您的回答。

答案 4 :(得分:0)

根据您需要的复杂程度,有两种不错的方法(第二种来自here)。

方法#1 var foo='bar'; return (foo ? foo : 'default'); 表示如果第二个节点存在,则返回其值,否则默认值为。这与我可能关闭的js @defaultValue[not(true_condition)] | @ValueYouNeed[true_condition]实际上是一样的,但是从我到目前为止看到的行为来看,订单确实需要工作,因此右侧是可变侧,因为如果双方都是真的,右手边归还。

方法#2 如果您需要更多控制权,例如当您要返回的值和您需要评估的值不相同时,您可能会执行以下操作:exslt:not-set()将其与1 2 3 4 5 6 7 8 9 10 1 2 3 4 9 8 8 5 6 4 技巧结合使用有一个默认的字符串值而不是另一个节点评估。