【问题标题】:Conditional AND OR two different values条件 AND OR 两个不同的值
【发布时间】:2011-07-24 10:58:19
【问题描述】:

我有两个不同变量的 AND 和 OR 串联。我尝试了以下方法:

<xsl:if test="$countryCode = '104'
               and 
              (transactionType != 'Allowance'
                or 
               revenueCenter != '1100')">

但这不起作用。是否可以进行条件测试或者我必须像这样拆分它:

<xsl:if test="$countryCode='104'>

在第二个元素中我这样做:

<xsl:if transactionType!='Allowance' or revenueCenter!='1100'>

【问题讨论】:

  • 什么是transactionType和receiverCenter?变量引用可能有问题(为什么不用$?)第二种方法是错误的
  • 它是如何“不工作”的?你有什么结果吗?如果是这样,它们与您的预期有何不同?
  • 您好 Zoltan,参考资料没问题。我确实通过在 元素中输出它们来检查它们。如果 countryCode 匹配 104 并且其他条件之一为真(在相应的引用中没有“Allowance”和“1100”),则应该创建某个 XML 元素。我正在尝试使用“包含”功能。也许我得到了想要的输出。
  • 好问题,+1。请参阅我的答案以获取解释并提出更安全的重构。

标签: xslt conditional-statements


【解决方案1】:

XPath 表达式

    $countryCode='104' 
   and  
    (transactionType!='Allowance' or revenueCenter!='1100')

语法正确

我们不能说任何关于语义的事情,因为没有提供 XML 文档,也没有解释表达式必须选择什么。

像往常一样,建议不要使用 != 运算符,除非确实有必要 - 当参数之一是节点集(或序列或节点集)时使用它在 XPath 2.0 中)与大多数人的预期相差甚远。

而不是!=更好地使用函数not()

  $countryCode='104' 
 and  
  (not(transactionType='Allowance') or not(revenueCenter='1100'))

这可以进一步重构为更短且等价的:

  $countryCode='104' 
 and  
  not(transactionType='Allowance' and revenueCenter='1100')

【讨论】:

  • 您好 Dimitre,非常感谢您的回答。我不知道运算符“!=”的问题。我一直在使用它,但将来会尝试使用“not()”。我尝试了您的最后一个示例代码,它运行良好 - 谢谢!
  • 主要区别在于如果没有transactionType,transactionType != 'Allowance'返回false,而not(transactionType = 'Allowance')返回true。以后请提供一些源XML,以便更容易为您提供帮助。
  • @Peter:不客气。我正忙于阅读@Michael-Kay 撰写的关于在浏览器中实现 XSLT 2.0 的 XML 布拉格文章——好东西!!!
猜你喜欢
  • 2019-06-07
  • 1970-01-01
  • 2013-11-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多