2011-01-13 3 views
6

나는 다음과 같은 XSLT 노드가 있습니다XSLT for each-statement에 여러 필터를 추가하려면 어떻게해야합니까?

<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> 
+0

XML 샘플을 제공해야합니다. – Flack

+0

좋은 질문입니다, +1. 설명 및 여러 가지 일회용 솔루션에 대한 내 대답을 참조하십시오. :) –

답변

19

그러나, 나는에 사용하는 여러 개의 필터를 싶습니다 당신의 진짜 문제는 XPath는 하나 때문이다-각

: 이 가능하며, 방법, 지정 술어 내부에 하나 이상의 조건이 있습니까?

대답 :

예, 표준 XPath는 부울 연산자 orand 표준의 XPath 기능 not() 사용합니다.

이 특별한 경우

select 속성에 XPath는 수 있습니다 다음 != 운영자가 있기 때문에

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

: 저는 개인적으로 항상 동등한 식을 작성하는 것을 선호

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

피연산자 중 하나가 노드 집합 인 경우 비 직관적 인 동작입니다.

하지만 당신은 아마 원하는 것을 추측하고 두 comparissons을 and했다 - 그or하지.

+0

+1 완전하고 우수한 답변입니다. –

+0

기회가 생기면! = 연산자의 비 직관적 인 행동에 대한 설명을 설명하거나 연결해 주시겠습니까? 감사! –

+0

@Neil Whitaker :'! = '연산자의 피연산자 중 적어도 하나가 노드 집합 (또는 XPath 2.0의 노드 집합이나 시퀀스)이면,'$ arg1 = $ arg2 '와'$ arg1! = $ arg2'는 동시에 true입니다. 단지'! ='연산자의 정의를 읽으십시오. 'not ($ arg1 = $ arg2)'를 사용하면 피할 수 있습니다. –

0

분명히 데이터를 새로 고치는 것을 잊어 버렸습니다. 시도 # 2는 완벽하게 작동합니다. 바라건대이 예제는 다른 사람을 도와줍니다.

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

@ Dimitre - Rowling이 Moby Dick이라는 책을 쓴다면, 그 책에 대한 술어는 틀림없이 거짓일까요? –

+0

@ 마이클 : 물론 당신이 옳습니다. 아마 같은 요소가 다른 값을 가진 두 개의'! ='비교에 참여하고 있다고 생각 했었습니다. 어젯밤에 꽤 피곤 했어야 했어. 어쨌든, 나는 내 대답에서 비슷한 진술을 삭제했다. 고맙습니다. –

1

여러 술어가 필요한 경우 가장 간단한 방법은 여러 술어 만 사용하는 것입니다. 나는 "나"보다는 "와"오히려 당신이 정말로 원하는 것 같은데요!

는 일반적으로
<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> 
관련 문제