2017-11-23 18 views
1

실제 XML 구조는 다음과 같아야합니다 (아니요, 변경할 수 없음). 어떤 시점에서 우리가 필요, 우리는 각각의 반환 XML 노드 목록에 detailrecord 반환 핸들 그런XML 마스터 및 세부 정보가 XML 내부의 개별 데이터 세트 인 경우

detailnodes = doc.documentElement.getElementsByTagName('/root/detail') 

:

<root> 
    <master> 
    <record> 
     <ID>1</ID> 
     <Value>One</Value> 
    </record> 
    <record> 
     <ID>2</ID> 
     <Value>Two</Value> 
    </record> 
    </master> 
    <detail> 
    <record> 
     <ID>A</ID> 
     <MasterID>1</MasterID> 
     <Value>Somevalue a</Value> 
    </record> 
    <record> 
     <ID>B</ID> 
     <MasterID>2</MasterID> 
     <Value>Somevalue b</Value> 
    </record> 
    <record> 
     <ID>C</ID> 
     <MasterID>1</MasterID> 
     <Value>Somevalue c</Value> 
    </record> 
    <record> 
     <ID>D</ID> 
     <Value>Somevalue d</Value> 
    </record> 
    </detail> 
</root> 

먼저 우리는 가능한 상세 기록의 목록을 반환하는 XML에 XPath 쿼리를 수행 값은 XPath 표현식만을 사용하는 detailnode의 MasterID를 기반으로 마스터 레코드의 값입니다. 우리는 (선호하는 방법

for each detailnode in detailnodes do 
    masterID = detailnode.ChildNodes['MasterID'].value 
    masterValue = detailnode.selectNodes('../master[ID=" + MasterID + "]/Value')[0].value 
end 

예 (이 마음에 들지) 현재 레코드의 MasterID를 retreive하는 응용 프로그램 코드를 사용하고 입수해온 값

예에 따라 XPath 식을 만들지 않으)

for each detailnode in detailnodes do 
    masterValue = detailnode.selectNodes('../master[ID=?MasterID?]/Value')[0].value 
end 

는 XPath 식 내부 ?MasterID? 현재 detailnode MasterID의 값을 반환한다.

순수한 XPath 표현식을 사용해도 가능합니까?

편집 참고 : 난 당신이 현재 범위의 데이터에 의해 키가 다른 곳은 XML 문서에서 값을 조회 할 수 있어야 ... MSXML DOM을 사용하여이 작업을 얻을 수

+0

나는'value'를 작은'v'로 씁니다. 그러나 XML은 대문자가됩니다. 이것은 "오류"를 찾기가 어려울 수도 있습니다 – Shnugo

+0

OK, 데모를 업데이트합니다 (실제 구조는 훨씬 복잡합니다. 문제를 설명하기위한 것일뿐입니다) –

답변

0

이 보인다 돌아갑니다 MSXML을 사용하여이 작업을 수행 할 방법이 없기 때문에 특정 XML 구조에 대한 코드를 수정하지 않고도 X-Path를보다 동적으로 만들 수있는 다른 방법이 필요합니다.

0

예 필요 current()을 사용합니다. 또한, 1을 기반으로 XML은 색인을 참고, 그래서 당신과 같이, [1]를 사용해야합니다 :이

for $r in /root/detail/record 
    return <record> 
     { 
      <MasterValue> 
      { 
      /root/master/record[(ID/text())[1]=($r/MasterID/text())[1]]/Value/text() 
      } 
      </MasterValue> 
      | $r/* 
      } 
     </record> 

같은

(//master/record[ID=current()/MasterID]/Value)[1] 
+0

아이디어를 제공해 주셔서 감사 합니다만 msxml DOM이 지원하지 않습니다. 'current()'함수. - 초기 질문에이 요구 사항을 추가했습니다. –

+1

맞습니다. MSXml DOM을 사용하여 XSL 컨텍스트를 얻는 것이 거의 불가능 해 보입니다. XPath 3을 사용하면 [let '키워드] (https://www.w3.org/TR/xpath-30/#id-let-expressions)를 통해 외부 상태를 캡처 할 수 있습니다 (하지만 MS는 V1 프로세서 만 지원함). 또는 XSLT에서 xml 변환을 수행하는 것이 좋습니다. 그건'current()'를 허용합니다 – StuartLC

+1

당신의 아이디어에 감사드립니다 -하지만 지금은 X-Path만을 사용해서 해결할 수없는 것 같습니다. 그리고이 시점에서 XSLT를 사용하는 방법을 모르므로 XSLT는 직접 사용할 수 없습니다. –

0

XQuery

<record> 
    <ID>A</ID> 
    <MasterID>1</MasterID> 
    <Value>Somevalue a</Value> 
    <MasterValue>One</MasterValue> 
</record> 
<record> 
    <ID>B</ID> 
    <MasterID>2</MasterID> 
    <Value>Somevalue b</Value> 
    <MasterValue>Two</MasterValue> 
</record> 
<record> 
    <ID>C</ID> 
    <MasterID>1</MasterID> 
    <Value>Somevalue c</Value> 
    <MasterValue>One</MasterValue> 
</record> 
<record> 
    <ID>D</ID> 
    <Value>Somevalue d</Value> 
    <MasterValue/> 
</record> 
+0

XML 노드의'SelectNodes' 루틴과 함께 MSXML DOM을 사용할 수 있습니까? (추가 요구 사항 참조) ... –

+0

@ R.Hoek 죄송합니다. 경험에 의하면'SelectNodes' 작동 방식을 잘 모릅니다 ...그러나 ** XPath 내에서 ** 해당 값을 찾기 위해 사용하는 방식이 효과적입니다. 노드에 ''레벨을 묻지 말고 ''의 레코드를 반복하고'/ master/record [ID =./MasterID]/Value'와 같은 표현식을 사용하여 해당 마스터 값을 찾습니다. './MasterID'의 점은 현재 요소를 가리 킵니다. '/ text()'를 추가하면 더 맛이 나지 않습니다 (귀하의 경우). – Shnugo

+0

가 basicly 나는 세부 노드를 통해 itterating 해요 : '''detailnodes = doc.documentElement.getElementsByTagName ('/ 루트/세부') 를 detailnodes의 각 detailnode에 대한 을 do''' 그리고 나는'''했습니다./MasterID'''하지만 그 기능도 작동하지 않습니다. 회신 bij @ StuartLC 찾고이 MSXML 함께 작동하지 않습니다 (이 시점에서) 기대하고있다. –