与 xslt:apply-templates 的混淆

问题描述 投票:0回答:1

我不明白应用模板在 XSLT 中是如何工作的。

现在我有了这个 XML 文档:

<?xml version="1.0" encoding="UTF-8"?>
<people>
    <person>
        <name>John Doe</name>
        <age>30</age>
        <occupation>Software Engineer</occupation>
    </person>
    <person>
        <name>Jane Smith</name>
        <age>28</age>
        <occupation>Graphic Designer</occupation>
    </person>
    <person>
        <name>Sam Brown</name>
        <age>35</age>
        <occupation>Data Analyst</occupation>
    </person>
</people>

还有这个 XSLT:

<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >
    <!-- Output -->
    <xsl:output method="html" />
    
    <!-- Default template -->
    <xsl:template match="/">
        <html>
            <body>
                <xsl:apply-templates />
            </body>
        </html>
    </xsl:template>
    
    <!--  Adding ages -->
    <xsl:template  match="person">
        <p>
            <xsl:value-of select="./name/text()" />
        </p>
    </xsl:template>
    
    <!-- Adding names -->
    <xsl:template  match="age">
        <p>
            <xsl:value-of select="./text()" />
        </p>
    </xsl:template>

</xsl:stylesheet>

当我运行它时,我得到的结果是这样的:

<html>
   <body>
      
      <p>John Doe</p>
      
      <p>Jane Smith</p>
      
      <p>Sam nkmk</p>
      
   </body>
</html>

这是出乎意料的,因为我想要人们的姓名和年龄,因为我定义了这两个模板。

this 问题的答案之一中,如下所述 XSLT 默认模板规则的定义方式是,默认情况下,它们将匹配文档的顶部节点,然后递归处理每个子节点节点,一直到底部,很公平,所以从技术上讲,人们会期望处理person节点,然后是子节点,并且由于有年龄模板,因此应该将年龄添加到html中,但事实并非如此。 (另外,根据this问题的第一个答案,它甚至应该打印姓名和职业,因为我没有定义与文本匹配的模板,就像这样)。

鉴于我是 XSLT 新手,所有这些都让我感到非常困惑。

你能向我解释一下这是怎么回事吗?

xml xslt
1个回答
0
投票

您遗漏了报价的重要部分,即“默认情况下”。

您的模板匹配

person
会覆盖默认的内置模板 - 并且它不会将模板应用于
age
(或任何其他)子级
person
。因此,匹配
age
的模板永远不会被实例化,否则会处理
person
的其他子级的内置模板也不会被实例化。

© www.soinside.com 2019 - 2024. All rights reserved.