2010-02-23 4 views
4

누구든지 제가 갖고있는이 작은 문제를 해결할 수 있습니까?XPath 두 속성 이름이 같을 때 현재 노드 값에서 노드를 선택하십시오.

는 XML

<MPN> 
    <MTR MSN="AB123456"/> 
    <MTR MSN="AB654321"/> 
    <MTR MSN="AB654322"/> 
    <MTR MSN="AB654323”/> 
    <MTR MSN="AB654324"/> 
    <JOB JobId="136"> 
     <JMR MSN="AB123456"> 
      <JRA DateActionRequiredBy="20090701120012" /> 
     </JMR> 
     <JMR MSN="AB654321"> 
      <JRA DateActionRequiredBy="20090701100010" /> 
     </JMR> 
    </JOB> 
</MPN> 

내가 파서가 하나가 반환되어야의 MTR 요소에 앉아 될 때 JRA 요소에서 DateActionRequiredBy를 검색하고 싶습니다.

나는 시도했다. 치수 {[2]}를 반환

../JOB/JMR[@MSN = @MSN]/JRA/@DateActionRequiredBy 

인해 @MSN에 노드 세트는,이 모두 일치하지 효과적으로 모 자체 일치 때문이다. 반환

../JOB/JMR[@MSN = ./@MSN]/JRA/@DateActionRequiredBy 

{치수 : [2]} 노드 집합

나는 해결책을 발견하지만 모든 XSL 내부 변수가 필요합니다 : 속성 바로 내 보이지 않는다.

<xsl:variable name="storeMSN" select="@MSN"/> 
../JOB/JMR[@MSN = $storeMSN]/JRA/@DateActionRequiredBy 

이 난 후 나는 무엇 특성

20090701120012 반환하지만 각 속성 변수보다이 기타를 달성하는 쉬운 방법이 있어야한다.

미리 감사드립니다.

답변

8
<MPN> 
    <MTR MSN="AB123456"/> 
    <MTR MSN="AB654321"/><!-- current node (i.e. context node) --> 
    <MTR MSN="AB654322"/> 
    <MTR MSN="AB654323”/> 
    <MTR MSN="AB654324"/> 
    <JOB JobId="136"> 
     <JMR MSN="AB123456"> 
      <JRA DateActionRequiredBy="20090701120012" /> 
     </JMR> 
     <JMR MSN="AB654321"> 
      <JRA DateActionRequiredBy="20090701100010" /><!-- desired node --> 
     </JMR> 
    </JOB> 
</MPN> 

당신이 XPath를 사용해야합니다 : current()는 XSLT 기능이기 때문에이 단지 XSLT에서 작동합니다

../JOB/JMR[@MSN = current()/@MSN]/JRA/@DateActionRequiredBy 

참고.

당신은 XSL 키를 추가하여 과정을 쉽게 수 :

<xsl:key name="kJMR" match="JMR" use="@MSN" /> 

과 XPath에에를 예상대로

key('kJMR', @MSN)/JRA/@DateActionRequiredBy 

설명이 왜 시도가 작동하지 않습니다. 두

  • ../JOB/JMR[@MSN = @MSN]/JRA/@DateActionRequiredBy
  • ../JOB/JMR[@MSN = ./@MSN]/JRA/@DateActionRequiredBy

는 자체 @MSN 비교 - 실패하지 않을 수있는 동작. 이렇게하면 모든 가능한 노드를 항상 얻을 수 있습니다.

조건 자 내에서 XPath 컨텍스트는 항상 조건자를 적용하는 노드입니다. current() 함수는 XSLT 컨텍스트를 제공합니다.

+0

예 현재()는 퍼즐에서 누락 된 부분이었습니다. 감사 ;-) – Nanook

관련 문제