2012-02-16 2 views
1

나는 이것을 설명하는 방법이 확실하지 않으므로 더 나은 방법이 있다면 알려 주시기 바랍니다.Xpath - 이것이 가능합니까? 값과 일치하는 다른 노드의 값을 가진 노드를 찾으십니까?

XML For를 검색해야하는 값이 있지만 내 결과 집합을 얻기 전에 다른 값을 검색하려고합니다.

내가 당신을 보여 드리죠 : 나는 1262753194.의 memidnum이

<n:TaskGetResponse> 
    <MemHead> 
     <memidnum>1262753194</memidnum> 
     <memrecno>22672100</memrecno> 
    </MemHead> 
    <MemHead> 
     <memidnum>1262753194</memidnum> 
     <memrecno>22672104</memrecno> 
    </MemHead> 
    <EntXtsk> 
     <caudrecno>6348855</caudrecno> 
     <memrecno>22672100</memrecno> 
    </EntXtsk> 
    <EntXtsk> 
     <caudrecno>6348855</caudrecno> 
     <memrecno>22672101</memrecno> 
    </EntXtsk> 
    <EntXtsk> 
     <caudrecno>6348878</caudrecno> 
     <memrecno>22672102</memrecno> 
    </EntXtsk> 
    <MemXtsk> 
     <caudrecno>6348878</caudrecno> 
     <memrecno>22672103</memrecno> 
    </MemXtsk> 
</n:TaskGetResponse> 

를 내가 찾으려 1262753194.

의 memidnum있는 모든 MemHead의의와 일치하는 memrecno이있는 모든 EntXtsk 및 MemXtsk 이 예제에서는 동일한 memidnum을 가진 MemHead가 2 개 있지만 다른 memrecno는 두 개의 memrecno가 있습니다. 2와 일치하는 memrecno가있는 모든 * Xtsk를 찾고 싶습니다.

XPath에서 가능합니까?

TaskGetResponse/*[name(.) = 'MemXtsk' or name(.) = 'EntXtsk'] 

내가 모든 * Xtsk 노드를 얻을 수 있습니다 사용

.

하지만 필요한 memidnum-> memrecno와 관련된 것만 얻는 방법을 모르겠습니다.

도움이 필요합니다.

업데이트 : 나는

TaskGetResponse/*[memrecno= //TaskGetResponse/*[memidnum="1262753194"]/memrecno] 

를 실행할 수 있습니다 그리고 그것은 나에게 그 memrecno 조합으로 모든 것을 가져옵니다. 하지만 나는 단지 EntXtsk와 MemXtsk를 얻는 방법을 모르겠습니다.

답변

1

사용가 :

/*/*[self::EntXtsk or self::MemXtsk] 
     [memrecno 
     = 
     /*/MemHead[memidnum = 1262753194]/memrecno 
     ] 

EntXtsk 또는 MemXtsk라는 이름의 모든 요소를 ​​선택하고, 그 XML 문서의 최상위 요소의 자식이며, 그 누구의 문자열 값과 동일한하는 memrecno 아이를 가지고 XML 문서의 최상위 요소의 자식 인 MemHead 요소의 자식이며, 그 또한 그 문자열 값입니다 memidnum 아이가 어떤 memrecno 요소의 문자열 값 "1262753194"

XSLT - 기반의 검증은 (난 강력하게 어떤 XPath는 탐사에 대한 the XPath Visualizer를 사용하는 것이 좋습니다) :

이 XML 문서 (마지막에 추가 된 또 하나 개의 MemXtsk 요소와 함께 제공되는 하나)에 적용
<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 
<xsl:strip-space elements="*"/> 

<xsl:template match="/"> 
    <xsl:copy-of select= 
    "/*/*[self::EntXtsk or self::MemXtsk] 
      [memrecno 
      = 
      /*/MemHead[memidnum = 1262753194]/memrecno 
      ] 
    "/> 
</xsl:template> 
</xsl:stylesheet> 

:

<n:TaskGetResponse xmlns:n="n"> 
    <MemHead> 
     <memidnum>1262753194</memidnum> 
     <memrecno>22672100</memrecno> 
    </MemHead> 
    <MemHead> 
     <memidnum>1262753194</memidnum> 
     <memrecno>22672104</memrecno> 
    </MemHead> 
    <EntXtsk> 
     <caudrecno>6348855</caudrecno> 
     <memrecno>22672100</memrecno> 
    </EntXtsk> 
    <EntXtsk> 
     <caudrecno>6348855</caudrecno> 
     <memrecno>22672101</memrecno> 
    </EntXtsk> 
    <EntXtsk> 
     <caudrecno>6348878</caudrecno> 
     <memrecno>22672102</memrecno> 
    </EntXtsk> 
    <MemXtsk> 
     <caudrecno>6348878</caudrecno> 
     <memrecno>22672103</memrecno> 
    </MemXtsk> 
    <MemXtsk> 
     <caudrecno>6348879</caudrecno> 
     <memrecno>22672104</memrecno> 
    </MemXtsk> 
</n:TaskGetResponse> 

출력하는 XPath 식 복사 평가 선택된 노드 :

<EntXtsk xmlns:n="n"> 
    <caudrecno>6348855</caudrecno> 
    <memrecno>22672100</memrecno> 
</EntXtsk> 
<MemXtsk xmlns:n="n"> 
    <caudrecno>6348879</caudrecno> 
    <memrecno>22672104</memrecno> 
</MemXtsk> 
+0

굉장 - 고마워! –

+0

@RyanTernier : 안녕하세요. 임의의 XPath 탐색을 위해 XPath 비주얼 라이저 (http://www.huttar.net/dimitre/XPV/TopXML-XPV.html)를 사용할 수도 있습니다. 수천 년 동안 수천 명이 XPath를 사용하여 XPath를 재미있는 방식으로 배웠습니다. –

관련 문제