Xml XSLT转换的流程

Xml XSLT转换的流程,xml,xslt,Xml,Xslt,我有一个关于XSLT转换的程序流的问题。我有以下XML: <Telefonliste> <Eintrag att="1"> <name>Peter</name> <nachname>Pan</nachname> <Tel>12345</Tel> </Eintrag> <Eintrag> &l

我有一个关于XSLT转换的程序流的问题。我有以下XML:

<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>
这正是我对这种转变的建议。首先调用根的模板,打印根节点,然后将模板应用于child::node。在apply templates子句中没有选择。然后调用第二个模板,该模板打印一次测试。然后根节点的模板再次打印根节点,然后转换完成

如果运行转换B,则会得到以下输出:

Root node
Peter
Pan
12345
Max
Mustermann
98765
Root node
根节点的打印在这里很清楚。但为什么会打印所有子节点值?我不明白,没有循环。我只需要一个值,即当前上下文节点的值


有人能解释一下吗?

考虑以下样式表:

<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返回所选节点的值,该字符串值包括所有子代文本节点。

XSLT处理器读取从文档节点开始的XML树/。对于样式表A和B,执行的第一个模板将是匹配/的模板。 /的模板将输出文本根节点,并将对文档节点/的所有子节点执行模板xsl:appy templates。XML的文档节点有一个子元素Telephonist

样式表A和B没有完全匹配Telefonliste的模板,因此匹配任何节点|@*的模板将用于元素Telefonliste

对于样式表,节点|@*的模板将生成输出测试。XSLT处理器将返回到文档节点/的模板,以输出第二个根节点


节点|@*的样式表B模板将从元素Telefonliste输出所有PCData,无论排除属性的深度有多深。

是否有解释,为什么该值包括所有子代文本节点?如果我使用像./*-这样的路径表达式,我会期望出现这种行为。我真的很困惑它是由以下内容规定的:元素节点的字符串值是元素节点的所有文本节点后代的字符串值按文档顺序串联在一起。
Root node
Test
Root node
Root node
Peter
Pan
12345
Max
Mustermann
98765
Root node
<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>