Как добавить несколько фильтров в XSLT для каждого оператора? - PullRequest
7 голосов
/ 14 января 2011

У меня есть следующий узел XSLT:

<xsl:for-each select="Book[title != 'Moby Dick']">
....
</xsl:for-each>

Однако я бы хотел использовать несколько фильтров для каждого. Я пробовал следующее, но это не похоже на работу:

<!-- Attempt #1 -->
<xsl:for-each select="Book[title != 'Moby Dick'] or Book[author != 'Rowling'] ">
....
</xsl:for-each>


<!-- Attempt #2 -->
<xsl:for-each select="Book[title != 'Moby Dick' or author != 'Rowling']">
....
</xsl:for-each>

Ответы [ 3 ]

21 голосов
/ 14 января 2011

Однако я бы хотел использовать несколько фильтров для каждого

Ваш реальный вопрос - это XPath one : Возможно ли и как указать более одного условия внутри предиката?

Ответ

Да, используйте стандартные логические операторы XPath or и and и стандартную функцию XPath not().

В этом конкретном случае XPath в атрибуте select может быть :

Book[title != 'Moby Dick' or author != 'Rowling']

Лично я всегда предпочел бы написать эквивалентное выражение:

Book[not(title = 'Moby Dick') or not(author = 'Rowling')]

потому что оператор != имеет неинтуитивное поведение, когда один из его операндов является набором узлов.

Но я предполагаю, что вы, вероятно, хотели, чтобы and два сравнения, а не or их .

1 голос
/ 14 января 2011

Если вам нужно несколько предикатов, самый простой способ - просто использовать несколько предикатов. Я предполагаю, что вы действительно хотите "и", а не "или":

<xsl:for-each select="Book[title != 'Moby Dick'][author != 'Rowling'] ">
....
</xsl:for-each>

Как правило, оператора! = Лучше избегать, потому что он имеет неожиданные эффекты, когда автор отсутствует или когда есть несколько авторов. Лучше написать:

<xsl:for-each select="Book[not(title = 'Moby Dick')][not(author = 'Rowling')] ">
....
</xsl:for-each>
0 голосов
/ 14 января 2011

Видимо, я забыл обновить свои данные. Попытка № 2 работает отлично. Надеюсь, этот пример поможет кому-то еще.

<!-- Attempt #2 -->
<xsl:for-each select="Book[title != 'Moby Dick' or author != 'Rowling']">
....
</xsl:for-each>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...