문제

XPath를 사용하여 XML 파일에서 데이터를 추출하는 응용 프로그램이 있습니다.해당 XML 소스 파일의 노드가 누락된 경우 "N/A" 값을 반환하고 싶습니다(Oracle NVL 함수와 유사).비결은 응용 프로그램이 XSLT를 지원하지 않는다는 것입니다.XPath와 XPath만 사용하여 이 작업을 수행하고 싶습니다.

그게 가능합니까?

도움이 되었습니까?

해결책

수행할 수 있지만 노드가 존재할 때 반환 값이 다음과 같은 경우에만 가능합니다. 노드 자체가 아닌 노드의 문자열 값.XPath

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

문자열 값을 반환합니다. baz 요소가 존재하는 경우, 그렇지 않은 경우 문자열 "N/A"입니다.

접근 방식을 일반화하려면 다음을 수행하십시오.

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

어디 $null-value null 값 문자열이고 $node 노드를 선택하는 표현식입니다.만약에 참고하세요 $node 둘 이상의 노드를 포함하는 노드 세트로 평가되며, 첫 번째 노드가 사용됩니다.

다른 팁

짧은 답변:아니요.이러한 기능은 XPath 사양 버전 2에서 고려되었으며 명시적으로 거부되었습니다(비표준 참조). 예시적인 사용자 작성 함수 섹션).

빈 노드의 경우 다음이 필요합니다.

boolean(string-length($node))

(전화를 생략할 수 있습니다. number() 부울에서 숫자로의 캐스트가 여기에 암시되어 있기 때문입니다.)

XPath 1.0을 사용하면 가능합니다.당신이 가지고 있다고 말해

<foo>
  <bar/>
</foo>

혹시 테스트하고 싶으시다면 foo 가지고있다 baz 어린이,

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

표현식의 경우 "N/A"를 반환합니다. /foo/baz 빈 노드 집합을 반환하고, 그렇지 않으면 빈 문자열을 반환합니다.

@jelovirt

따라서 이것을 올바르게 이해하면 기본 응답과 노드 값을 연결한 다음 노드의 존재를 테스트하여 결과 문자열의 올바른 하위 집합을 가져와 오프셋을 0 또는 내 바로 다음 위치로 설정합니다. 기본 문자열.그것은 내가 본 것 중 가장 비뚤어진 언어입니다.(나는 그것을 좋아한다!)

말한 내용을 명확히 하기 위해 이 접근 방식은 노드가 비어 있을 때가 아니라 노드가 누락되었을 때 작동합니다.그러나 "number(boolean($node))"를 "string-length($node)"로 바꾸면 대신 빈 노드에서 작동합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top