2016-10-24 4 views
1

아래 XML 값을 얻는 방법을 알고 싶습니다. 여러 가지 접근 방식을 시도하고 올바른 해결책을 찾을 수없는 것 같습니다.여러 태그 및 값을 기준으로 XSLT 값을 선택하십시오.

<a> 
    <aid>ok</aid> 
    <b> 
     <bid>ok</bid> 
     <c> 
      <cid>ok</cid> 
      <d> 
       <dValue>goal</dValue> 
      </d> 
     </c> 
    </b> 
</a> 

조건 기준 아래 충족해야합니다 <a><aid> 값이 괜찮

  • 경우 <a><b><bid> 값이 괜찮
  • 경우 <a><b><c><cid> 값이 괜찮
  • 경우
  • 그때 내가 <a><b><c><d><dValue>
  • 의 값이 필요합니다

나는 이미 두 시간을 보냈으므로 도움이 될 것입니다. 아, xslt 2.0을 사용하고 있습니다.

답변

3
<xsl:value-of select="a[aid='ok']/b[bid='ok']/c[cid='ok']/d/dValue"/> 
+0

:

<x> <xid>ok</xid> <y> <yid>ok</yid> <z> <zid>ok</zid> <t> <dValue>goal2</dValue> </t> </z> </y> </x> 

다시 원하는 정확한 결과을 생산하고 있습니다. 나는 멀지 않았지만 대괄호에 실수를했기 때문에 내 시도에서 아무 것도 찾지 못했습니다. 감사합니다 – Matjaz

1

보다 일반적인 작업 :

이 경우 요소의 이름은 중요하지 않고 경로 (중첩 된 요소의 수)의 깊이는 하나가 될 수 있지만, 아이들이 같이있다 "ID"가 추가 부모의 이름,이 XPath는 2.0 표현은 현재 하나를 포함하여, 이러한 모든 경우에 원하는 결과를 produses :

//dValue[every $anc in ../ancestor::* 
      satisfies $anc/*[name() eq concat($anc/name(), 'id')]/string() eq 'ok' ]/string() 

XSLT 2.0 검증 :

<a> 
    <aid>ok</aid> 
    <b> 
     <bid>ok</bid> 
     <c> 
      <cid>ok</cid> 
      <d> 
       <dValue>goal</dValue> 
      </d> 
     </c> 
    </b> 
</a> 

는 표현식을 평가하고,이 평가 결과 출력 :

goal 

을 이러한 변화는 제공된 XML 문서에인가

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="text"/> 

    <xsl:template match="/"> 
    <xsl:sequence select= 
    "//dValue[every $anc in ../ancestor::* 
     satisfies $anc/*[name() eq concat($anc/name(), 'id')]/string() eq 'ok' ]/string()"/> 
    </xsl:template> 
</xsl:stylesheet> 

이 XML 문서에 같은 변환 적용 : 첫 번째 시도에서 근무

goal2 
+0

심지어 좋은 해결책입니다, 제 경우에는 과잉으로 보입니다. 그러나 미래에 그것을 필요로한다면, 고마워. 고마워. – Matjaz

+2

@Matjaz, XPath 2.0 솔루션을 원했기 때문에이 글을 썼습니다. :) –

관련 문제