2017-10-01 7 views
0

나는 아래 xml을가집니다. XSLT 상대 경로

<MpGroup> 
<MpGroupItem> 
     <MeasurePoints> 
      <MeasurePointItem> 
       <Measures> 
        <MeasureItem> 
         <Name>xyz</Name> 
         <Result>2</Result> 

        </MeasureItem> 
        <MeasureItem> 
         <Name>rty</Name> 
         <Result>2</Result> 

        </MeasureItem> 
       </Measures> 
       <MeasureLimit> 
        <CurveLimit> 
         <CurveLimitItem> 
          <X>1</X> 
          <Y1>1</Y1> 
          <Y2>1</Y2> 
         </CurveLimitItem> 
         <CurveLimitItem> 
          <X>2</X> 
          <Y1>1</Y1> 
          <Y2>1</Y2> 
         </CurveLimitItem> 
        </CurveLimit> 

        <CurveYUnit></CurveYUnit> 
       </MeasureLimit> 


      </MeasurePointItem> 
     </MeasurePoints> 
     <Name>ABC</Name> 

</MpGroupItem> 

나는 MeasureItem 내부이고 거기에서 내가 MpGroup/MpGroupItem/이름의 값을 얻을 필요가

. 나는 xpath를 사용하고 싶지 않다. //../../../../Name과 같은 상대 경로를 사용하고 싶습니다.

코드가 xslt 이하이지만 작동하지 않습니다.

     <xsl:for-each select="MpGroups/MpGroupItem"> 

        <xsl:for-each select="MeasurePoints/MeasurePointItem"> 
         <xsl:if test="Measures != ''"> 
          <xsl:for-each select="Measures/MeasureItem"> 
           <InputValue><xsl:value-of select="normalize-space(//../../../../Name)"/></InputValue> 
          </xsl:for-each> 
         </xsl:if> 
         <xsl:if test="Measures = ''"> 
          <InputValue><xsl:value-of select="normalize-space(//../../Name)"/></InputValue> 
         </xsl:if> 


        </xsl:for-each> 
        </xsl:for-each> 

누구든지 xpath 대신 상대 경로를 사용하는 방법을 알려주십시오. 어떤 도움을 많이 주시면 감사하겠습니다.

답변

0

당신의 질문은 XSLT로 표시되어 있지만 "xpath를 사용하고 싶지 않습니다"라고 말하면 값을 선택하는 것은 XPath가 입력 XML 문서에서 값을 선택하기 위해 XSLT에서 사용되는 언어이므로 의미가 없습니다.

MeasureItem 요소에서 ancestor::MpGroup/MpGroupItem/Name 이상을 직접 ancestor::MpGroupItem/Name으로 이동하려는 것처럼 들립니다.

+0

예 마틴 당신 말이 맞습니다. 사실 저는 xslt에 익숙하지 않습니다. //../../../../Name과 같은 이름을 사용하여이를 달성 할 수있는 방법이 있습니까? – user3736941

+0

'//../../../../ Name '이라는 다소 이상한 접근법을 왜 사용하고 싶은지 이해할 수 없습니다. 무엇으로 표현하고 싶습니까? 문맥이'MeasureItem' 엘리먼트라면, 두 개의 제안은'MpGroupItem' 엘리먼트의'Name' 자식을 각각 선택하기 위해 탐색하는 작업을하는 것처럼 보입니다. 나는 누구도'/ descendant-or-self :: node() /'를 사용하는'/'을 사용하여 부모 축을 네 번 위로 탐색 한 다음 자식에 액세스하는 것을 본 적이 없다. 조상 축을 사용하고'MeasureItem' 엘리먼트의 부모 축을 사용하고자한다면'../../../../ Name /'이해야합니다. –

0

명백한 접근 방법이 이유를 밝히지 않고 사용하기를 원하지 않는다고 대답 할 때 대답하기가 약간 어렵습니다. 즉, 한 솔루션을 다른 솔루션보다 선호하는 기준이 무엇인지 궁금해합니다.

당신이 우리에게 준 XML이 불완전하기 때문에

는 (가장 바깥쪽에있는 요소에는 종료 태그가 없다) 아마도 당신은 실제로 문서에 하나 이상의 MpGroupItem을 가지고, 당신은 "현재"의 Name 요소 MpGroupItem을 찾고 있습니다 (즉, 컨텍스트 항목의 MpGroupItem 컨테이너). 그럴 경우 (그리고 그것은 자연스러운 추측입니다), 가장 적합한 XPath 식은 아마도 ancestor::MpGroupItem/Name이 될 것입니다. 원하는 경우 ../../../Name을 사용할 수 있지만 읽기 쉽고 덜 강력합니다. 이 경로의 시작 부분에 //을 사용하는 것은 틀 렸을 것입니다.