Логическое ИЛИ в XPath?Почему не |за работой? - PullRequest
0 голосов
/ 20 октября 2018

У меня есть шаблон 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 будет пропускаться при вызове шаблона (т. Е. ... не предок или сам с [критериями] или темойс заголовочным атрибутом outputclass 'noNum' ...) .Однако кажется, что критерии, которые я добавил, обрабатываются как что-то, что шаблон соответствует и соответствует.

Предполагая, что я прав по последнему пункту, я считаю, что мне нужно поместить это условие в собственное утверждение «не», но я не уверен, как это сделать с условиями, уже присутствующими вXPath.

1 Ответ

0 голосов
/ 20 октября 2018

В XPath | это набор оператор объединения , а не логическое ИЛИ.

Оператор объединения, |

XPath1.0

Оператор | вычисляет объединение его операндов, которые должны быть наборами узлов.

XPath 2.0 +

Операторы union и | эквивалентны.Они принимают в качестве операндов две последовательности узлов и возвращают последовательность, содержащую все узлы, встречающиеся в любом из операндов.


Логическое ИЛИ, or

Использование or вместо логическое ИЛИ .


Сложный XPath все еще не работает?

Разбейте его на более мелкие части:

  1. Выбирает ли //*[contains(@class, ' bookmap/chapter ')] то, что вы ожидаете?Повторите для каждой из самых основных частей вашего логического выражения индивидуально .

  2. Объедините эти индивидуально проверенные термины или предикаты, по одному за раз, и наблюдайте, что каждый шагпо ходу дела сюрпризов не бывает.

  3. Устраните все расхождения между ожидаемыми и фактическими результатами, прежде чем объединять дополнительные условия.

...