2014-09-03 1 views
0

나는이 같은 구조를 가지고있다.XPath는 조건과 조건에 루트 아래에 검색 루트는

나는 기본적으로 어쩌면 넣을 수있는 더 좋은 방법을 "나에게라는 이름의 노드를 제공 배제하지 않는다"거나, 말을이 뭔가를 추가 할 내 XPath 쿼리

//*[not(name()='error') and jcr:contains(*, 'searchInput')] 

을 위해 지금까지 구조 "exclude라는 이름의 노드를 검색에서 제외"합니다. 처음에 사용 된 경로를 사용하여 // 할 수 있는지 잘 모르겠습니다. 다른 방법으로 필터링하는 것입니다. 나는 루트 (root) 아래의 한 레벨 만보고 그 레벨의 노드만을 제외하기 때문에 나는 (name() = 'exclude')라고 말할 수 없다는 것을 안다.

아래 1 단계 더 검색하고 특정 노드를 이름으로 제외하거나 전체 문서에서 모든 것을 검색하고 특정 이름의 노드를 제외 할 수있는 방법이 있습니까?

중요한 것은 확실하지 않지만 CMS Magnolia에서 사이트 검색을 시도하고 있습니다. 나는 jcr sql2를 사용하여 한계에 부딪쳤다. 그리고 지금까지 이것을 연구하면서 발견 한 것을 내가 할 수 없다.

편집 : 답변과 의견을 바탕으로

가, 여기에 내가 지금보고있는 무슨이다 :

//*[not(@sv:name='exclude' or @sv:name='error') and jcr:contains(*, 'searchInput)] 

나는 여전히이 '제외'받고있는 것으로 보인다 결과 내가해야 하나하지 'sv :'를 올바르게 등록했거나 검색 결과의 일부를 제외시키는 데 필요한 쿼리에 뭔가 빠졌습니다. exclude라는 이름의 노드 (요소)를 self을 통해 선택할 수 있습니다

+1

'name()'을 사용하지만'@ name'을 실제로 사용할 수 있습니까? – Tomalak

+0

방금 ​​확인했는데 어느 쪽이 효과가있는 것으로 보입니다. 아마 @name은 더 잘 수행하지만 나는 손을 알지 못할 것입니다. – wondergoat77

+0

그들은 다른 것들입니다. 'name()'은 현재 사용중인 노드의 이름을 알려줍니다. 'exclude'라는 노드가 없습니다. 하지만 당신은'name'이라는 이름의 * 속성을 가진 노드와'exclude '라는 이름의 노드를'b'라고 부릅니다. 그리고 속성은'@ '로 얻을 수 있습니다. – Tomalak

답변

1

나는 기본적으로 "나에게라는 이름의 노드를 제공 배제하지 않는다"그것은 쉽게

을 말하는이 뭔가를 추가 할 축,
*[self::exclude]을 사용합니다. 결론 : exclude으로 명명되지 않은 요소는 *[not(self::exclude)]입니다.

그러나 나는 당신이 요소 이름을 언급하지 않는다고 생각합니다. 입력에 <exclude> 요소가 없습니다.

실제로는 속성을 참조하는 것으로 보입니다.

//*[not(@sv:name = 'error' or @sv:name = 'exclude') and jcr:contains(*, 'searchInput')] 
0

나는 모두의와 b의를 얻을 수 있지만 내 검색에서 어떤 C의 콘텐츠를 제외하는 것을 시도하고있다.

적어도 순수 XPath에서는 불가능합니다. XPath는 의 언어로, 노드를 XML 트리에서 선택하고 다른 새 트리를 빌드하는 데 사용하지 않습니다.XPath 표현식은 a을 선택하거나 a을 선택하지 않을 수 있지만 a 요소는 원래 a이 아닌 일부 자식 만 가질 수 있습니다.

+0

그건 내가 두려워했던거야. 나는 내가 다른 것을하고있는 것을 성취 할 수있는 방법이 있는지 궁금해. – wondergoat77

+0

@ wondergoat77 하나의 XML 구조를 다른 XML 구조로 변환하려면 XSLT 또는 XQuery와 같은 상위 수준 언어를 사용할 수 있지만 더 쉽게 사용할 수있는 CMS가 있는지 여부는 알 수 없습니다. –

+0

@ wondergoat77 내가보기에, 나는 다른 출력 트리를 만들고 싶지는 않다고 생각한다. 검색에서 특정 노드를 제외하기 만하면됩니다. XPath에서는 이러한 많은 부분이 절대적으로 가능합니다. – Tomalak