我有* .xml文件
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="xq340.xsl"?>
<wine grape="Cabernet">
<winery>Duckpond</winery>
<product>Merit Selection</product>
<year>1996</year>
<price>11.99</price>
</wine>
和这个* .xsl文件
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="html" omit-xml-declaration="yes"/>
<xsl:template match="winery">
<b><font size="10pt"><xsl:apply-templates/>
<xsl:text> </xsl:text>
<xsl:value-of select="../@grape"/></font></b><br/>
</xsl:template>
<xsl:template match="product">
<i><font size="10pt"><xsl:apply-templates/></font></i><br/>
</xsl:template>
<xsl:template match="year | price">
<font size="10pt"><xsl:apply-templates/></font><br/>
</xsl:template>
</xsl:stylesheet>
以某种方式这是输出
Duckpond Cabernet
优异选择
1996年
11.99
这可能很多,但我不明白xsl如何逐步通过xml来生成html。
我认为就是这样;第一个模板匹配“winery”,然后它写入粗体和字体标签。这是我迷路的地方,下一条指令是“apply-templates”,这将激活产品模板,编写斜体标签,然后“apply-templates”并编写年份和价格的字体标签。在我的“书”中,我应该得到这样的东西:
<b>
<font size="10pt">
<i>
<font size="10pt">
<font size="10pt">
<font size="10pt"></font>
<br/>
</font>
</font>
</i>
<br/>
</font>
</b>
<br/>
还有“select =”../@ grape“我假设它是获得实际xml节点值的那个;但是,这是整个xml节点的名称,所以我真的不知道是什么它已经到了。
以下是我的问题:
</xsl:template>
被命中时,是
其他两个模板“产品”和“年份|价格”再次调用?感谢。我想我在尝试理解这一切的流程时遇到了问题。
答案 0 :(得分:4)
XSLT可能被忽视的细节是内置模板。一个内置模板在标准的某个地方定义,但基本上说(除其他外)总是将文本节点直接复制到输出。所以这就是你绊倒的地方:第一个xsl:apply-templates
触发了这个标准模板,这就产生了这个词&#34; Duckpond&#34;在输出中。通过删除那里的xsl:apply-templates
来检查它。 &#34; Duckpond&#34;消失。 (我认为,这可以看一下no-op XSL transform。)
你实际上有xsl:apply-templates
向后做的事情。它并没有告诉XSLT运行一堆模板。 xsl:call-template
这样做。相反,它基本上是从我们现在的地方说出来的,运行你知道似乎匹配的任何模板。&#34;您第一时间的位置在winery
标记内。那里有什么?只有包含Duckpond
的文本节点。
关于第三个问题,其他两个模板实际上正在做的是替换这些元素类型的内置模板。 XSLT会在正常遍历时遇到它们(请参阅默认模板)。当它正常找到它们时,它只会转出它们的文本(尝试它 - 注释掉那些模板)。这些模板会导致它首先围绕它们设置一些格式。
默认情况下,XSLT已经遍历整个文档。所以你不必告诉它如何在程序上做到这一点。这就是他们称之为声明性语言的原因。你可以在它找到你关心的东西时告诉它该怎么做,而不用担心它是如何到达那里的。
如果您想要更多控制权,您基本上可以覆盖标准模板,并使您的第一个模板与/
匹配。