2017-05-15 7 views
0

노드에 각 과일은 이것보다 조금 더 복잡한 별도의 .XML 내 :결합 XPath의/XS 캐스팅 할 수 없습니다 : untypedAtomic입니다가 30K + 파일 데이터베이스에서 작업

<Fruit> 
<Node1 name="papaya"><Childnode1 skincolor="YELLOW"></Childnode1></Node1> 
<Node2 color="red"></Node2> 
</Fruit> 

<Fruit> 
<Node1 name="apple"><Childnode1 skincolor="red"></Childnode1></Node1> 
<Node2 color="Yellow"></Node2> 
</Fruit> 

<Fruit> 
<Node1 name="banana"><Childnode1 skincolor="yELLOW"></Childnode1></Node1> 
<Node2 color="yellow"></Node2> 
</Fruit> 

나는 두 개의 동일한 문자열을 보았다 다른 속성 :

/Fruit/Node1/Childnode1[matches(@skincolor,'yellow','i')/data(Fruit/Node1/@name) /Fruit/Node2[matches(@color,'yellow','i')]/data(Fruit/Node1/@name)

일부 결과는 중복 (이 예에서만 바나나), 그래서 하나의 표현으로 두 경로를 다시 시도 :

/Fruit/Node1/Childnode1[matches(@skincolor,'yellow','i')/data(Fruit/@name) | /Fruit/Node2[matches(@color,'yellow','i')]/data(Fruit/@name)

"xs : untypedAtomic을 node()"로 캐스팅 할 수 없습니다. 내 의도는 그들을 결합한 다음 고유 한 값만 유지하는 것이 었습니다. 저는 XML/프로그래밍/초를 처음 접했으므로 5라는 것과 XML을 배우는 것처럼 설명하십시오.

+0

첫 번째 XPath가 유효하지 않습니다. Stack Overflow에 제출하기 전에 쿼리를 확인한 경우 독자에게 도움이 될 것입니다. –

+0

미안합니다. 내 노트북은 나쁜 상태 였고 간단한 쿼리가 30 분 정도 걸렸습니다. 다음 번에는 더 조심스럽게 될 것입니다. – wlwy

답변

0

UNION 연산자는 단지 노드 세트/시퀀스에 적용되지만, 데이터를 호출하여 식() 함수는 원자의 시퀀스를 반환 값.

어쨌든 원본 경로 표현이 잘못되었습니다. 우리가 "]"실종 추가하는 경우 Fruit/@name의 컨텍스트 항목이 Fruit 아이가없는 Childnode1 요소이기 때문에 아무것도 선택하지 것이다

/Fruit/Node1/Childnode1[matches(@skincolor,'yellow','i')]/data(Fruit/@name)

있습니다. 그것은 당신이 정확하게 당신이 중복 무슨 뜻인지 고려할 필요가 중복을 제거하기 위해

/Fruit[Node1/Childnode1[matches(@skincolor,'yellow','i')]]/data(@name)

예를

들어 있어야한다. 두 개의 서로 다른 Fruit 요소 (모두 @name="banana")가있는 경우 해당 요소를 중복으로 처리 하시겠습니까? 상황이 발생하지 않으면 어느쪽으로 든 갈 수 있습니다. 중복으로 "두 표현식이 동일한 과일 요소를 선택"한다는 것을 의미하는 경우, 조합 연산자 "|"를 사용할 수 있습니다. 중복을 제거하십시오. "두 표현식 모두 @name과 동일한 값을 가진 과일 요소를 선택"한다는 것을 의미하는 경우 distinct-values ​​()를 사용해야합니다.

+0

은 현재 예상되는 결과가 없었던 이유를 알고 있습니다. 내 원래 xpath는 closing을 가졌지 만, 당신의 수정 된 xpath는 그 트릭을했습니다. 실제로는 @name과 동일한 값을 가진 별개의 항목이 있습니다. 조합 연산자를 사용합니다. 고마워요! – wlwy

1

함수 FN : 고유 - 값이 사용될 수있다 :

distinct-values(/Fruit/(
    Node1/Childnode1[matches(@skincolor,'yellow','i')], 
    Node2[matches(@color,'yellow','i')] 
)/Fruit/@name) 
+0

xpath가 잘못된 결과를 나타 내기 때문에 히트가 발생하지 않았습니다. 그럼에도 불구하고 고마워. – wlwy