2011-11-01 5 views
3

xquery를 eXist에 쓰고 있습니다.xpath의 변수

fn:doc($document_name)/root/a 

을하지만 지금은 문자열 변수에서 XPath를하고 싶어 :

보통 내가 XML로 항목을 선택하려면이 방법을 사용

let $xpath := request:get-parameter("xpath", "") 
fn:doc($document_name)/$xpath 

물론이 작동하지 않습니다.

util:eval(fn:concat("fn:doc($document_name)", $xpath)):) 

을하지만 느리고 안전하지 때문에 내가 eval를 사용하지 않으 : 지금 발견하는 유일한 방법은 eval을 사용하고 있습니다.

내가 거기에 알고 같은 뭔가 :

fn:doc($document_name)/*[name()='node_name'] 

하지만 전체 경로를 통해 항목을 선택합니다뿐만 아니라 나 또한 node-xpath()을 사용하려고하지만, 한 노드 의 이름이 방법을 모르는 그냥 사용하십시오 name()

답변

5

당신은 eval() 함수가하는 일을하고 싶으므로 어떤 해결책이라도 eval과 동일한 문제가 발생할 것입니다. 고려할 수있는 다른 접근 방법은 쿼리를 생성 한 다음 실행하는 것입니다.하지만 정확히 동일한 문제가 발생합니다. 문자열을 XPath 식의 하위 집합 (예 : 조건 자 또는 함수 호출 없음)으로 제한하는 것이 더 안전하다고 생각하면 간단한 정규식을 사용하여 해당 조건을 테스트 해 볼 수 있습니다.

+0

확인

마이클 도움이 내가 다른 선택의 여지가 없어 보인다. 고맙습니다. – owenwater

1

Michael Kay가 맞았음에도 불구하고 functx:dynamic-path()이 도움이되었습니다.

fn : eval 사이에 앉아서 동적으로 쿼리를 생성하는 좋은 중간 솔루션 일 수 있습니다.

희망이,

+0

좋은 생각인지 아닌지는 잘 모르겠지만, 적어도 eXist는이 기능을 지금 지원하지 않습니다. – owenwater

+0

@owen_water functx 라이브러리를 포함해야합니다. 참조 : http://www.xqueryfunctions.com/xq/functx-1.0-doc-2007-01.xq – wst

관련 문제