我有一个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
的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
,以为这是附加条件,在这种情况下,调用模板时count
调用将跳过(即...不是祖先或-带有[条件]的自我或标题输出类属性为'noNum'的主题...)。但是,看来我添加的条件被视为模板确实匹配并依赖的东西。假设我在最后一点上是正确的,我相信我需要将该条件放在它自己的“ not”语句中,但是我不确定如何使用XPath中已经存在的条件来做到这一点。
最佳答案
在XPath中,|
是集合联合运算符,而不是逻辑OR。
联合运营商,|
XPath 1.0
|
运算符计算其操作数的并集,该操作数必须是节点集。
XPath 2.0+
union
和|
运算符是等效的。它们将两个节点序列作为操作数,并返回一个序列,其中包含在两个操作数中出现的所有节点。
逻辑或,or
使用or
代替logical OR。
复杂的XPath仍然无法正常工作?
将其分解为较小的部分://*[contains(@class, ' bookmap/chapter ')]
是否选择您所期望的?分别对逻辑表达式的每个最基本部分重复。
一次组合那些经过单独验证的术语或谓词,并观察到此过程中的每一步都不会感到意外。
在合并其他条款之前,请修复预期结果与实际结果之间的任何差异。
关于xml - XPath中的逻辑或?为什么不加工?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52900626/