2017-01-06 7 views
0
  <p> 
      <p1>c</p1> 
      <a languageCode="en">a1</a> 
      <a languageCode="de">a2</a> 
      <ca> 
       <cc>056</cc> 
       <cs>BE-VAN</cs> 
       <cs>BG-VLI</cs> 
       <cs>BG-VLI</cs> 
      </ca> 
      <ca> 
       <cc>056</cc> 
       <cs>BE-VAN</cs> 
       <cs>BG-VLI</cs> 
       <cs>BG-VLI</cs> 
      </ca> 
     </p> 

を親要素の-兄弟の前に検索:私は、これは動作しませんしようとしたXSLTで

<xsl:for-each select="p/ca/*"> 
    <xsl:if test="not(preceding-sibling::*[1]/name() = local-name())"> 
      <precedingParent n="{preceding-sibling::*[1]/parent::*/name()}"></precedingParent> 
    </xsl:if> 
</xsl:for-each> 

しかし 出力があるべき予想:

<precedingParent n="a"></precedingParent> 

私はカリフォルニア州でループしていますし、例えばcsの最初の出現で 要素csの親caの親の先行する兄弟を探したい場合は?どうすればいいのですか?

+0

することができますあなたのXSLTコードの関連部分を示してください。ちょうど私たちが正しいコンテキストを持っていることを確かめることができます。ありがとうございました! –

+0

@TimC質問を更新しました。 – divya

答えて

2

あなたが探している表現は../preceding-sibling::*[1]/name()です。例えば、

<xsl:for-each select="p/ca/*"> 
     <xsl:if test="not(preceding-sibling::*[1]/name() = local-name())"> 
      <precedingParent n="{../preceding-sibling::*[1]/name()}"></precedingParent> 
     </xsl:if> 
    </xsl:for-each> 

注意name(../preceding-sibling::*[1])はまた、(XSLT 1.0とXSLT 2.0で)動作するだろう。

一方、あなたは毎回再計算させ、それを保存するために、ネストされたループを有し、子要素を選択する前に、前の値を取得することによって、わずかに、より効率的かもしれない:

<xsl:for-each select="p/ca"> 
     <xsl:variable name="precedingParent" select="name(preceding-sibling::*[1])" /> 
     <xsl:for-each select="*"> 
      <xsl:if test="not(preceding-sibling::*[1]/name() = local-name())"> 
       <precedingParent n="{$precedingParent}"></precedingParent> 
      </xsl:if> 
     </xsl:for-each>   
    </xsl:for-each>  
+0

これはクールです。 – divya

関連する問題