1

为什么没有这一行:

apply-templates select="*/*(在 XSLT 文件中的“shop”元素下)

将粗体格式应用于Blake2? 输出如下所示:

XSLT 中 root 的开始

“第 1 步开始” Alexis(任务:销售) Employee2(任务:) Blake2 “第 1 步完成”

XSLT 中根的结尾

我的问题是,为什么不是Blake2粗体?它在<employee>元素之下。

将该行更改为*apply-templates select="*"粗体Blake2。是什么让这与众不同?

这是 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>

</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 /> <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"> 
<b> <xsl:apply-templates select="name"/> </b> 
(Task: <xsl:apply-templates select="task"/>) 
<br></br> 
</xsl:template> 

</xsl:stylesheet>
4

2 回答 2

0

首先,让我们看看 xslt 处理器是如何工作的。为了运行/实例化/激活 xslt 中的模板,它们必须“匹配”。现在,问问自己:

  • 他们匹配什么?
  • 例如,什么满足的match="root"

随着 xslt 的加载,输入文档,或者更确切地说,它的顶级节点,会受到它的注意。您的输入文档以一个root节点开始,所以这就是首先进入 xslt 的内容。它立即满足match="root"。简单的。

现在对于employee,那颗小宝石什么时候匹配?

好吧,xslt 处理器不会遍历每个可能的节点并查看它是否有匹配的模板。它只对您告诉它的节点执行此操作

  • 这就是你要做的xsl:apply-templates select='...'
  • 为了employee使输入中的 -nodes 成为 xslt-ed,需要在xsl:apply-templates某处选择它们。

好的,那发生了什么?在您的shop模板中,您选择*/*将模板应用到,即“当前节点的子节点的子节点”(如果您愿意,可以选择“孙子节点”)。

  • shop模板中的当前节点shop表示人员节点内的两个员工节点被选中(*/*扩展为person/employee)。
  • Blake2 是节点的兄弟shop节点,不会被选中。
  • 更改*select返回作为 shop 节点的子节点的personemployee节点。

那么不加粗的 Blake2是从哪里来的呢?好吧,非粗体 Blake2 并非源自您创建的任何模板,他只是默认行为的受害者,其中文本节点而非元素节点从输入复制到输出。


如果你想真正使用 xslt,你需要学习一些东西。我建议从身份转换开始(谷歌是你的朋友),然后通过为它们提供一个空模板来删除一些元素。比进行一对一的翻译,比如说,将所有元素大写。混入属性。尝试使用 xpath 条件 ( [this stuff]) 进行更严格的匹配。看看更复杂的结构,例如条件和循环结构。深入研究变量、参数和调用模板。使用文档()。

玩得开心!

于 2012-06-10T12:04:11.150 回答
-1

您的第三个模板不会选择<employee>文档中的任何元素。它只选择<employee>作为当前元素的直接子节点的元素。在根级别,这不适用于任何元素,但由于第二个模板由<apply-templates>第一个元素*/*中的当前元素的子元素),<employee>元素中的<person>元素被选中。

第二个<employee>元素不是元素的子元素的子<shop>元素,而是元素的直接子<shop>元素,因此不会通过*/*从 at 开始选择<shop>

当您更改*/*为 时*,两个<employee>元素都被选中:第二个元素被选中,因为它直接匹配*(的直接子元素<shop>)。*也选择<person>,并且由于没有为该元素指定模板,因此将执行默认行为,这意味着模板将应用于 的子元素<person>,其中包括第一个<employee>元素。

于 2012-06-10T09:17:41.787 回答