2008-09-02 11 views
8

XPath를 사용하여 XML 파일에서 데이터를 추출하는 응용 프로그램이 있습니다. 해당 XML 소스 파일의 노드가 누락 된 경우 "N/A"값을 리턴하려고합니다 (Oracle NVL 기능과 매우 유사합니다). 트릭은 응용 프로그램이 XSLT를 지원하지 않는다는 것입니다. XPath와 XPath만으로이 작업을하고 싶습니다.XPath에서 누락 된 태그의 값을 만들 수 있습니까?

그럴 수 있습니까?

답변

5

노드가 존재할 때의 반환 값이 인 경우에만 노드의 문자열 값이며 노드 자체는이 아닙니다. 존재하는 경우는 XPath

substring(concat("N/A", /foo/baz), 4 * number(boolean(/foo/baz))) 

baz 요소의 문자열 값을 반환합니다 그렇지 않으면 문자열 "N/A".

는 접근 방식을 일반화하기 : $null-value가 null 값 문자열과 $node 노드를 선택하는 식입니다

substring(concat($null-value, $node), 
      (string-length($null-value) + 1) * number(boolean($node))) 

. $node이 두 개 이상의 노드를 포함하는 노드 집합을 평가할 경우 문자열 값의 첫 번째 노드 인이 사용됩니다.

1

XPath 1.0을 사용하여 수행 할 수 있습니다. 그렇지 않으면 반환식이 /foo/baz 빈 노드 집합을 반환하는 경우

substring("N/A", 4 * number(boolean(/foo/baz))) 

는 "N/A"를 반환합니다, 당신은 foobaz 아이가있는 경우 테스트하려는 경우

<foo> 
    <bar/> 
</foo> 

을 말해봐 빈 문자열

1

는 @jelovirt

내가 올바르게 이해한다면, 우리는 기본 응답과 노드의 값을 연결 한 다음를 설정하는 노드의 존재 여부를 테스트하여 결과 문자열의 정확한 집합을 0 또는 내 기본 문자열 바로 뒤에 오는 위치로 오프셋. 그것은 제가 지금까지 본 언어 중 가장 비뚤어진 꼬임입니다. (나는 그것을 좋아한다!)

당신이 말했던 것을 명백하게하기 위해,이 접근법은 노드가없는 경우가 아니라 노드가없는 경우에 작동한다. 그러나 "number (boolean ($ node))"를 "string-length ($ node)"로 바꾸면 빈 노드 대신 작동합니다. 빈 노드

2

, 당신은 (여기서 당신은 수 부울에서 주조로 number()에 전화를 생략 할 수 있습니다 암시한다.)

boolean(string-length($node)) 

필요한