2017-10-01 19 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のような相対パスを使いたいです。

私は以下のコードを持っていますが、動作しません。

     <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

あなたの質問は「Xpathを使用したくない」と言って値を選択しても意味がありません.XPathはXSLTで入力XMLドキュメントから値を選択するために使用される言語です。

MeasureItemの要素からancestor::MpGroup/MpGroupItem/Name以上に直接移動してancestor::MpGroupItem/Nameに直接アクセスしたいと思うように聞こえます。

+0

はいマーティンが正しいです。実際、私はxsltを初めて使っています。 //../../../../Nameのような名前を使って、それを達成する方法はありますか? – user3736941

+0

なぜ、あなたが '//../../../../ Name'でそのむしろ奇妙なアプローチを使いたいのか分かりませんが、それで何を表現したいですか?コンテキストが 'MeasureItem'要素なら、私の2つの提案は' MpGroupItem'要素の 'Name'子をそれぞれ選択するように移動するように働くようです。私は誰も '/ descendant-or-self :: node()/'を意味する)を使って親軸を4回上に移動してから子にアクセスするのを見たことがない祖先軸を使用し、 'MeasureItem'要素から親軸を使用したい場合、' ../../../../ Name/'が行うべきです。 –

0

明白なアプローチが理由を述べずに使用したくないと答えたときは、少し答えにくいです。これは、あるソリューションを他のソリューションより優先させるための基準が何であるか不思議に思っていることを意味します。

あなたが私たちに与えているXMLは、おそらくあなたが実際に文書内に複数のMpGroupItemを持っている、とあなたは「現在の」MpGroupItemName要素を探している、(最も外側の要素には終了タグがありません)不完全であるので、 (すなわち、コンテクスト項目のMpGroupItemコンテナ)。そのような場合(それは野生の推測です)、最も適切なXPath式はおそらくancestor::MpGroupItem/Nameになります。あなたが好きであれば../../../Nameを使うことができますが、読みやすさと堅牢性は劣ります。このパスの最初に//を使用すると間違いなく間違いでしょう。