XPath中的逻辑或?为什么不工作吗?

时间:2018-10-19 22:25:14

标签: xml xslt xpath xsl-fo dita

我有一个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元素和一个outputclass的{​​{1}}时。 / p>

noNum

如上所示,我在第一个<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> 语句之后添加了| *[contains(title/@outputclass, 'noNum')],以为这是附加条件,在这种情况下,not调用将在模板被调用时跳过(例如 ...不是具有[criteria]的祖先或自身或标题输出类属性为'noNum'...的主题)。但是,看来我添加的条件被视为模板匹配并可以计数的内容。

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

1 个答案:

答案 0 :(得分:3)

在XPath |中,是一组 union运算符,而不是逻辑或。

联合运算符|

XPath 1.0

  

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

XPath 2.0+

  

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


逻辑或,or

使用or代替logical OR


复杂的XPath仍然无法正常工作吗?

将其细分为较小的部分:

  1. //*[contains(@class, ' bookmap/chapter ')]是否选择您期望的内容?分别对逻辑表达式的每个最基本部分重复

  2. 将那些经过单独验证的术语或谓词组合起来,一次一次,并观察到这一过程中的每一步都没有意外。

  3. 在合并其他条款之前,请修复预期结果与实际结果之间的所有差异。