解释xsl是如何处理xml的



我有这个*.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>

不知怎么的,这就是输出

鸭池赤霞珠
优异选择
1996
11.99

这可能很多,但我不明白xsl是如何通过xml生成html的。

我认为是这样的;第一个模板匹配"wintery",然后写粗体和字体标签。这就是我迷失的地方,下一个指令是"应用模板",这将激活产品模板,写斜体标签,然后"应用模板",写年份和价格的字体标签。在我的"书"中,我应该得到这样的东西:

<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节点的名称,所以我真的不知道它得到了什么

以下是我的问题:

  1. 第一个"应用模板"如何返回"鸭池">
  2. 当酒庄中的第一个"应用模板"被称为尝试再次匹配自身还是尝试匹配所有其他模板还是只显示在后面的模板
  3. 当第一个模板结束标记</xsl:template>被命中时另外两个模板"product"one_answers"year|price"又调用了

谢谢。我想我在试图理解这一切的流程时遇到了问题。

XSLT的一个可能被忽视的细节是有内置模板。标准中定义了一个内置模板,但基本上说(除其他外)始终将文本节点直接复制到输出中。因此,这就是您遇到的问题:第一个xsl:apply-templates触发了这个标准模板,这就是在输出中产生单词"Duckpond"的原因。通过移除那里的xsl:apply-templates来检查它。"鸭池"消失了。(我认为,看看无操作XSL转换会很有启发性。)

实际上,xsl:apply-templates有点倒退。它并没有告诉XSLT去运行一堆模板。xsl:call-template就是这样做的。相反,它基本上说"从我们现在的开始,运行任何你知道的似乎匹配的模板。"第一刻你所在的位置在winery标签内。下面是什么?只有一个包含Duckpond的文本节点。

关于第三个问题,其他两个模板真正做的是替换这些元素类型的内置模板。XSLT在进行正常遍历时会遇到它们(请参阅默认模板)。当它正常找到它们时,它只会转储它们的文本(试试——注释掉那些模板)。这些模板导致它首先围绕它们设置一些格式。

默认情况下,XSLT已经遍历了整个文档。所以你不必告诉它如何在程序上做到这一点。这就是为什么他们称之为声明性语言。相反,当它发现你关心的东西时,你可以告诉它该怎么办,而不必太担心它是如何到达那里的。

如果你想要更多的控制,你基本上可以覆盖标准模板,并使你的第一个模板匹配/

最新更新