2012-02-12 3 views
4

ノードセット変数のノードを反復処理するとき、ノードのすべての祖先(例えば、$ myVariable [7])を返すXPATH 1.0式が必要です - 祖先ではありませんノードセット変数には、元の文書の祖先が含まれます。ソースドキュメント内の変数の位置に対するXPath

私はこれらのいずれかがうまくいくと思っていましたが、どちらもそうは思いませんでした。

select="//*[generate-id()=generate-id($myVariable[7])]/ancestor::*" 
select="id(generate-id($myVariable[7]))/ancestor::*" 

私は閉じていますか?

編集:私の質問の中心ではありませんが、私は//ancestorでした。余分なスラッシュは不要です。

+0

Xalanに関連する非XSLソリューション例えば(あなたがJavaでこれを変換しているのなら)拡張機能?または、どのような変換技術を使用していますか? –

+0

変換はブラウザで行われているため、XSLT 1.0ではノードセットの拡張子だけが使用されます。 – JPM

答えて

2

あなたの表現

//*[generate-id()=generate-id($myVariable[7])]/ancestor::* 

が正しいです。

「うまくいきません」という理由は、$myVariable[7]にあなたが期待しているものが含まれていないことが原因である可能性があります。

ここでは、上記の式を使用して期待値を生成する単純な完全な例を示します。正しい結果

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 

<xsl:variable name="myVariable" 
     select="/*/*/*/*/num"/> 

<xsl:template match="/"> 
    <xsl:for-each select= 
    "//*[generate-id() 
     = 
     generate-id($myVariable[7]) 
     ] 
     /ancestor::* 
    "> 
    <xsl:value-of select="name()"/> 
    <xsl:text>&#xA;</xsl:text> 
    </xsl:for-each> 
</xsl:template> 
</xsl:stylesheet> 

この変換は、以下のXML文書に適用される:

<a> 
    <b> 
     <c> 
      <nums> 
       <num>01</num> 
       <num>02</num> 
       <num>03</num> 
       <num>04</num> 
       <num>05</num> 
       <num>06</num> 
       <num>07</num> 
       <num>08</num> 
       <num>09</num> 
       <num>10</num> 
      </nums> 
     </c> 
    </b> 
</a> 

を希望、正しい結果が($myVariable[7]のすべての祖先の名前)が生成されます。

a 
b 
c 
nums 
+0

あなたは正しいです。私はselectではなくcopy-ofで変数を作成していました。結局、元のノードではありませんでした。ありがとうDimitre!あなたは私を正しい場所で探しています。 +1、Qが答えました。 – JPM

+0

@ JPM:どうぞよろしくお願いいたします。 –

関連する問題