XML和XSLT apply-templates选择

时间:2012-06-10 08:45:04

标签: xml select formatting xslt-1.0 apply-templates

这是XML文件:

<?xml version="1.0"?> 
<?xml-stylesheet type="text/xsl" href="2.xsl" ?>


<root>
    <shop>
        <person> 
            <employee> 
                <name> Alexis </name> 
                <role> Manager </role> 
                <task> Sales </task> 
            </employee> 

            <employee>
                <name> Employee2 </name>
            </employee>
        </person>

        <employee>
            <name> Blake2 </name>
        </employee>

    </shop>



    <person> 
        <employee2>
            <role2> Supervisor </role2> 
            <name2> Blake </name2> 
            <task2> Control </task2> 
        </employee2>
    </person>
</root>

这是XSLT文件:

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">



<xsl:template match="root"> 
<html><head></head> 
<body>
Start of root in XSLT <p/> <xsl:apply-templates select="person" /> <p/>

End of root in XSLT

</body> 
</html> 
</xsl:template> 



<xsl:template match="shop">
"Step 1 start"
<xsl:apply-templates select="*/*"/>
"Step 1 done" <p/>
</xsl:template> 



<xsl:template match="employee"> 
<u> <xsl:apply-templates select="name"/> </u> 
(Task: <xsl:apply-templates select="task"/>) 
<br></br> 
</xsl:template> 


</xsl:stylesheet>

输出结果为:

  

在XSLT中开始root

     

主管Blake Control

     

XSLT中的根目录

我的问题是,为什么Alexis和Employee2不是输出的一部分?它们都属于<person>元素......

2 个答案:

答案 0 :(得分:0)

但你不想只是任何的人吗?如果你这样做但却不知道怎么说,只需稍微削减一下,比如<xsl:apply-templates select="//person" />

答案 1 :(得分:0)

<xsl:template match="root">已应用于<root>元素。在那里,<xsl:apply-templates select="person" />选择<person>元素作为当前节点的直接子节点(根元素<root>)。由于没有为<person>本身定义模板,因此执行XSLT的默认行为,这意味着只复制文本节点。

其他模板根本没有执行,因为根级别上没有<shop><employee>元素(相对于文档本身),并且不会通过{{1}调用模板,或者。

为了更明确地回答您的问题,第一个<apply-templates>元素未被选中,因为它嵌套在另一个元素中,但您的<person>指令仅选择直接可见的<apply-templates>元素在当前节点中。