2012-06-22 5 views
0

Xquery를 사용하여 어떻게 다음 xml 문서에 xquery 표현식에 변수를 포함시킬 수 있습니까? 나는Xquery 표현식에서 변수 사용

<CD> 
     <TITLE>Picture book</TITLE> 
     <ARTIST>Simply Red</ARTIST> 
     <COUNTRY>EU</COUNTRY> 
     <COMPANY>Elektra</COMPANY> 
     <PRICE>7.20</PRICE> 
     <YEAR>1985</YEAR> 
    </CD> 
    <CD> 
     <TITLE>Red</TITLE> 
     <ARTIST>The Communards</ARTIST> 
     <COUNTRY>UK</COUNTRY> 
     <COMPANY>London</COMPANY> 
     <PRICE>7.80</PRICE> 
     <YEAR>1987</YEAR> 
    </CD> 
    <CD> 
     <TITLE>Unchain my heart</TITLE> 
     <ARTIST>Joe Cocker</ARTIST> 
     <COUNTRY>USA</COUNTRY> 
     <COMPANY>EMI</COMPANY> 
     <PRICE>8.20</PRICE> 
     <YEAR>1986</YEAR> 
    </CD> 

가 나는 년에 모든 CD를 반환하는 쿼리를 실행해야> 내가 변수로 "여기서"조항의 구성 요소가 좋아 싶어 1986 년, 나는에 YEAR > 1986를 저장하는 의미 다음과 같은 XML 문서를 가지고 쿼리에서 변수 세 가지 변수에 사용할 여기 나는 무엇을 지금까지

String queryString = 
       "declare variable $field :=" +"YEAR"+";"+ 
       "declare variable $operator :=" +">"+";"+ 
       "declare variable $value :=" +"1986"+";"+ 
       "declare variable $docName as xs:string external;" + sep + 
       "for $cat in doc($docName)/*/"+ "CD" + 
       "where $cat/$field $operator $value" + 
       "order by $cat/$field" + 
       "return $cat"; 

       XQExpression expression = conn.createExpression(); 
       expression.bindString(new QName("docName"), filename, 
       conn.createAtomicType(XQItemType.XQBASETYPE_STRING)); 
       results = expression.executeQuery(queryString); 
       return results.getSequenceAsString(new Properties()); 

내 쿼리 식는, 내가 변수를 사용하여 문제가 발생하고 생각 완벽하지, 어느 하나가 나를 도울 수

이걸 해결해 줘? 감사합니다.

답변

2

XQuery (및 XSLT/XPath)의 변수는 프로그램 텍스트의 일부가 아닌 값을 나타냅니다. 즉, 매크로 언어가 아닙니다. 텍스트 대체에 의해 변수가 작동하지 않습니다.

값에 변수를 사용하는 것은 간단합니다. x = $ value. * 이름() = $ 않음] = $ 값

하지만 운영자 변수를 사용하는 것은 가능하지 않다 : 요소 이름 변수를 사용

지나치게 어렵지 않다. 이 수준에 도달하면 문자열 연결을 사용하여 쿼리를 문자열로 생성 한 다음 컴파일하여 실행하는 것이 좋습니다. 실제로 당신은 어쨌든 (코드 삽입의 위험에 대해 걱정하지 않고, 나는 알 수있다.) 문자열로 질의를 생성하는 것처럼 보인다.

+0

답장을 보내 주셔서 감사합니다. 예, 올바른 변수는 운영자에게 사용할 수 없습니다. 하지만 쿼리에서 $ field 및 $ value 변수를 유지하고 명시 적으로 연산자를 지정할 수 있습니까? 나는 "cat/$ field"+ ">" "$ value"와 같이 쿼리를 변경하는 것을 의미합니다. 이것이 가능한가? – Lucy

+0

@Lourin - 나는 이것을하기 위해'saxon : evaluate()'과 같은 확장 함수를 사용해야한다고 생각한다. 어떤 프로세서를 사용하고 있습니까? –

+0

xqj를 사용 중입니다. 방금 XQuery에서 작업을 시작했습니다. saxon을 사용할 수 있습니까? xqj에서 evaluate()을 사용할 수 있습니까? 감사합니다 – Lucy