2011-07-19 3 views
2

私は、次の一時文書があるとします。XSLT - ドキュメントノードのリポジトリとして機能する一時ドキュメントを作成できますか?

<xsl:variable name="emc"> 
    <people> 
     <person id="1"> 
      <name>Jim</name> 
     </person> 
     <person id="2"> 
      <name>Joe</name> 
     </person> 
    </people> 
</xsl:variable> 

<xsl:variable name="ibm"> 
    <people> 
     <person id="1"> 
      <name>Joan</name> 
     </person> 
     <person id="2"> 
      <name>Allison</name> 
     </person> 
    </people> 
</xsl:variable> 

そして、私は、以前の文書のルートノードを格納するために別の文書を持つようにしたい:

<xsl:variable name="store"> 
    <store> 
     <doc>{$emc goes here}</doc> 
     <doc>{$ibm does here}</doc> 
    </store> 
</xsl:variable> 

私はこれを行うことができますが、私はありませんすることができます$ emcや$ ibmの値を使うことができるように、もっと長くdoc要素の内容を使います。

は$ DOC1 /人/人を持っている

<xsl:variable name="doc1" select="$store/store/doc[1]"> 

、ASと[1] IBM /人/人$と同じノードであることが、[1]

のいくつかのバージョンでは、このことが可能ですXSLT?

ありがとうございます。

答えて

2

ドキュメントノードのセットを格納する必要があるデータ構造は、ドキュメントではなくノードセットです。だからではなく、この:

<xsl:variable name="store"> 
    <store> 
     <doc>{$emc goes here}</doc> 
     <doc>{$ibm does here}</doc> 
    </store> 
</xsl:variable> 

だけでこれを行う:あなたが順序を制御することはできませんので、XSLT 1.0で

<xsl:variable name="store" select="$emc | $ibm"/> 

これは、厳密にノードセットです。 XSLT 2.0では、 "|"の代わりに "、"演算子を使用してノードシーケンスを定義することができ、ノードは必要な順番になります。

+0

だから、私はちょっとドキュメントに何とか保存できないようにしたいのですか?それは最終的に私がしたいことです。私は文書によって提供される構造が必要です。私がテンプレートパラメータを介して "店"を回ると、私は多くの管理ができ、テンプレート呼び出しのスタックの性質を取り巻くことは難しいです。ありがとう。 –

+0

@Fred、ドキュメントノードは親を持つことはできません。 (http://www.w3.org/TR/xpath-datamodel/#DocumentNode) "ドキュメントノードは子として表示されません"したがって、ドキュメント内にドキュメントを格納することはできません。私はあなたの質問を正しく理解している。 – LarsH

+0

これを可能にするためにノードを効果的に "ラップ"(または原子化)する方法があると思っていましたが、そうは思わないでしょう。ありがとう。 –

2

XSLTエンジンに特化したnode-setの機能を見てください。たとえば、MSXMLにはツリーをノードセットに変換する関数node-set()があります。 http://msdn.microsoft.com/en-us/library/ms256197.aspx

+1

@downvoter、Care to comment? –

+1

+1、有用な提案。 – LarsH

+0

上記のコメントを参照してください。ありがとう。 –

2

ここで起こっていることは、XSLT 1.0では、可変命令内のリテラルXMLの値が 'result tree fragment'(RTF)であることです。残念ながら、ノードセットとして直接処理することはできません文字列値を持つ単一ノードと同じように)。そのため、/または[]を使用するXPath式は機能しません。

解決策は、をnode-set()のように使用するか、@ polishchukが言ったように(しかし移植性はよりやわらかくなります)。またはXSLT 2.0を使用することができます。

XSLT 2.0では、RTF data type is eliminated(そして、非常に喜んでいました!)。変数の値は一時ツリーで、ソースツリーと同様にXPath演算子で操作できます。

更新:

あなたは「店の文書に」と言う(コメントは下記)、あなたは$store変数の値であり、一時的なツリーに保存ノードのアイデンティティを意味ですか?あなたの質問で構造化されたものがあるので、いくつかのXMLノードは2つの親を持たなければならないので不可能です。しかし、あなたは$storeツリーにデータの実際の場所を作り、そして$emc$ibmがそこから選択可能かもしれない:

<xsl:variable name="store"> 
    <store> 
     <doc id="emc"> 
      <people> 
       <person id="1"> 
        <name>Jim</name> 
       </person>... 
      </people> 
     </doc> 
     <doc id="ibm"> 
      <people> 
       <person id="1"> 
        <name>Joan</name> 
       </person>... 
      </people> 
     </doc> 
    </store> 
</xsl:variable> 

<xsl:variable name="emc" select="$store/store/doc[@id='emc']" /> 
<xsl:variable name="ibm" select="$store/store/doc[@id='ibm']" /> 

そして、$doc1/people/person[1]$ibm/people/person[1]と同じノードであることは事実だろう。

doc()と外部ファイルを使用していくつかのバリエーションを想像することができますが、その前に時間を費やす前に、あなたの要件、具体的には上記のシナリオがどのように適合しないかを知りたいと思うでしょう。

+0

$ doc1/people/person [1]と$ ibm/people/person [1]はSAMEノードでなければならないというコメントを逃したと思います。(これはxpathのIS関係です。私はストア文書に文書ノードを「格納」し、配置する前と同じようにそれらを抽出できるようにしたいと考えています。
これが役立つことを願っています。 –

+0

@Fred:あなたが正しいです、私はそのコメントを逃した、またはそれを誤解しました。私はコピーとは対照的にノードの身元を必要とする「入れようとしているとおりに正確にそれらを抽出する」ことが、あなたが何を意味するのかよく分かりません。 – LarsH

+0

@Fred、私の答えの更新を参照してください。 – LarsH

関連する問題