解释xsl如何处理xml

时间:2017-11-15 06:35:16

标签: xml xslt

我有* .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节点的名称,所以我真的不知道是什么它已经到了。

以下是我的问题:

  1. 第一个“apply-templates”如何返回“Duckpond”?
  2. 当酿酒厂的第一个“应用模板”被调用时,它也是 试图再次匹配自己或尝试匹配所有其他 模板或仅显示之后的模板?
  3. 当第一个模板结束标记</xsl:template>被命中时,是 其他两个模板“产品”和“年份|价格”再次调用?
  4. 感谢。我想我在尝试理解这一切的流程时遇到了问题。

1 个答案:

答案 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已经遍历整个文档。所以你不必告诉它如何在程序上做到这一点。这就是他们称之为声明性语言的原因。你可以在它找到你关心的东西时告诉它该怎么做,而不用担心它是如何到达那里的。

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