XPath에서 누락된 태그에 대한 값을 생성할 수 있습니까?
문제
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)"로 바꾸면 대신 빈 노드에서 작동합니다.