2017-07-05 13 views
0


XSLT変換のプログラムフローについて質問がありました。私は、次のXMLがありますXSLT変換の流れ

<Telefonliste> 
    <Eintrag att="1"> 
     <name>Peter</name> 
     <nachname>Pan</nachname> 
     <Tel>12345</Tel> 
    </Eintrag> 
    <Eintrag> 
     <name>Max</name> 
     <nachname>Mustermann</nachname> 
     <Tel>98765</Tel> 
    </Eintrag> 
</Telefonliste> 

をとXSLファイルAがあります:

<?xml version="1.0" encoding="UTF-8" ?> 
<xsl:transform version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="text"/> 

<xsl:template match="/"> 
    Root node 
    <xsl:apply-templates /> 
    Root node 
</xsl:template> 

<xsl:template match="node() | @*" > 
    <xsl:text>Test</xsl:text> 
</xsl:template> 

</xsl:transform> 

とXSLファイルBがあります:

<?xml version="1.0" encoding="UTF-8" ?> 
<xsl:transform version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="xml"/> 

<xsl:template match="/"> 
    Root node 
    <xsl:apply-templates /> 
    Root node 
</xsl:template> 

<xsl:template match="node() | @*" > 
    <xsl:value-of select="self::node()" /> 
</xsl:template> 

</xsl:transform> 

Aの出力は次のとおりです。

Root node 
Test 
Root node 

これは私が示唆しているものですその変換。最初にルートのテンプレートが呼び出され、 "Root node"が出力され、そのテンプレートがchild :: node()に適用されます(apply-templates節には選択がありません)。次に、1回の "Test"を印刷する2番目のテンプレートを呼び出します。次に、ルートノードのテンプレートが「ルートノード」を再度印刷し、変換が完了します。

Root node 
Peter 
Pan 
12345 
Max 
Mustermann 
98765 
Root node 

「ルートノード」の印刷がここに明確である:私は変態Bを実行する場合

、私は次の出力を取得します。しかし、なぜダイはすべての子ノードの値を出力しますか?私はそれを理解できません、ループはありません。私はただ1つの値、現在のコンテキストノードの値を期待します...

誰かがそれを説明できますか?

答えて

0

は、以下のスタイルシートを考えてみましょう:あなたの入力に加え

<xsl:transform version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="xml"/> 

<xsl:template match="/Telefonliste"> 
    Root node 
    <xsl:value-of select="self::node()" /> 
    Root node 
</xsl:template> 

</xsl:transform> 

を、結果は

あなたの変態Bのと同じになります。この理由は、xsl:value-of命令がのstring-valueを返すということです選択されたノード - この文字列値にはすべて子孫テキストノードが含まれます。

+0

どこかに説明があります。なぜその値にすべての子孫テキストノードが含まれていますか?私は ".//*"のようなパス式を実行すればその動作を期待します - 私は本当に混乱しています – chris000r

+0

[XPath仕様](https://www.w3.org/TR/xpath/#要素ノードの文字列値は、文書ノードの要素ノードのすべてのテキストノード子孫の文字列値の連結です。* –

+0

これは完全に理解できます。ありがとう! – chris000r

0

XSLTプロセッサは、ドキュメントノード(/)から始まるXMLツリーを読み取ります。両方のスタイルシート(AとB)について、実行される最初のテンプレートは、/と一致するテンプレートになります。 /のテンプレートは、テキストルートノードを出力し、ドキュメントノード(/)のすべての子にテンプレート(xsl:appy-templates)を実行します。 XMLのドキュメントノードには、子要素が1つあります。テレフォンスト。要素Telefonlisteのために使用されます|

あなたのスタイルシートのAとBは正確にTelefonlisteと一致するので、任意のノード(@ *ノードを())と一致するテンプレートは、テンプレートを持っていません。

スタイルシートの場合node()| @ *のテンプレートは、出力のテストを生成します。 XSLTプロセッサは、文書ノード/のテンプレートに戻り、2番目のルートノードを出力します。

node()| @ *のスタイルシートBテンプレートは、要素からすべてのPCDataを出力します。テレフォンリストは、属性を除外した深さには関係ありません。