Xml 逻辑还是XPath?为什么不是';工作?

Xml 逻辑还是XPath?为什么不是';工作?,xml,xslt,xpath,xsl-fo,dita,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">

我有一个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> 
如上所示,我在第一个
not
语句后添加了
|*[contains(title/@outputclass,'noNum')]
,认为这将作为一个附加条件,在调用模板时,
计数调用将跳过(即…不是具有[criteria]的祖先或自我)或标题outputclass属性为“noNum”…)的主题。但是,我添加的标准似乎被视为模板所匹配和计数的内容


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

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

联合运算符,
|

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

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


逻辑或、
使用
代替


复杂XPath仍然无法工作? 将其分解为更小的部分:

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

  • 将这些单独验证的术语或谓词组合在一起,一次一个,并观察沿途的每一步都不会有意外

  • 在合并其他条款之前,修复预期结果和实际结果之间的任何差异


  • 谢谢你澄清这一点。虽然
    仍然不起作用,但我的XPath显然还是有问题。如果不查看XML,很难说得更多,但我为逻辑连接器连接的复杂XPath表达式添加了一些通用调试技巧。
    <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>