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つの値、現在のコンテキストノードの値を期待します...
誰かがそれを説明できますか?
どこかに説明があります。なぜその値にすべての子孫テキストノードが含まれていますか?私は ".//*"のようなパス式を実行すればその動作を期待します - 私は本当に混乱しています – chris000r
[XPath仕様](https://www.w3.org/TR/xpath/#要素ノードの文字列値は、文書ノードの要素ノードのすべてのテキストノード子孫の文字列値の連結です。* –
これは完全に理解できます。ありがとう! – chris000r