【问题标题】:Logical OR in XPath? Why isn't | working?XPath 中的逻辑或?为什么没有 |在职的?
【发布时间】:2018-10-19 22:25:14
【问题描述】:

我有一个 XSLT 模板,它计算所有级别的主题,用于在我拥有的 DITA 项目中用编号标记这些主题。

<xsl:template match="*[contains(@class, ' bookmap/chapter ')] | *[contains(@class, ' map/topicref ')] [not(ancestor-or-self::*[contains(@class,' bookmap/frontmatter ')])]" mode="topicTitleNumber"> 
    <xsl:number format="1 " count="*[contains(@class, ' map/topicref ')] [not(ancestor-or-self::*[contains(@class,' bookmap/frontmatter ')])] | *[contains(@class, ' bookmap/chapter ')]" level="multiple"/> 
</xsl:template> 

我正在尝试为计数内容添加额外的排除项,因为当 topicref 类的 title 元素具有 outputclassnoNum 时。

<xsl:template match="*[contains(@class, ' bookmap/chapter ')] | *[contains(@class, ' map/topicref ')] [not(ancestor-or-self::*[contains(@class,' bookmap/frontmatter ')])]" mode="topicTitleNumber"> 
    <xsl:number format="1 " count="*[contains(@class, ' map/topicref ')] [not(ancestor-or-self::*[contains(@class,' bookmap/frontmatter ')] | *[contains(title/@outputclass, 'noNum')])] | *[contains(@class, ' bookmap/chapter ')]" level="multiple"/> 
</xsl:template> 

如上所示,我在第一个not 语句之后添加了| *[contains(title/@outputclass, 'noNum')],认为这将作为一个附加条件,其中count 调用将在调用模板时跳过(即...不是具有 [criteria] 的祖先或自我或标题 outputclass 属性为“noNum”的主题...)。但是,我添加的条件似乎被视为模板确实匹配和计数的东西。

假设我在最后一点上是正确的,我认为我需要将该条件放在它自己的“非”语句中,但我不确定如何使用 XPath 中已经存在的条件来做到这一点。

【问题讨论】:

    标签: xml xslt xpath xsl-fo dita


    【解决方案1】:

    在 XPath 中,| 是一个集合联合运算符,而不是逻辑 OR。

    联合运算符,|

    XPath 1.0

    | 运算符计算其操作数的并集,它必须是节点集。

    XPath 2.0+

    union| 运算符是等效的。它们将两个节点序列作为操作数,并返回一个序列,其中包含出现在任一操作数中的所有节点。


    逻辑或,or

    使用or 代替logical OR


    复杂的 XPath 仍然无法工作?

    把它分解成更小的部分:

    1. //*[contains(@class, ' bookmap/chapter ')] 会选择您所期望的吗?对逻辑表达式的每个最基本部分单独重复。

    2. 将这些单独验证的术语或谓词组合起来,一次一个,并观察沿途的每一步,没有意外。

    3. 在合并附加条款之前修复预期结果和实际结果之间的任何差异。

    【讨论】:

    • 感谢您解决这个问题。虽然or 仍然无法正常工作,但显然我的 XPath 仍然有问题。
    • 如果没有看到您的 XML,很难说更多,但我添加了一些通用调试技巧,用于通过逻辑连接器连接的复杂 XPath 表达式。
    猜你喜欢
    • 2018-10-20
    • 2011-05-31
    • 2011-10-15
    • 1970-01-01
    • 1970-01-01
    • 2015-02-28
    • 2022-01-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多