首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >XML和XSLT中的通配符格式

XML和XSLT中的通配符格式
EN

Stack Overflow用户
提问于 2012-06-10 09:06:44
回答 2查看 2.7K关注 0票数 1

为什么这句话不:

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

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

XSLT中根的

起始

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

XSLT根目录的末尾

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

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

以下是XML文件:

代码语言:javascript
复制
<?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文件:

代码语言:javascript
复制
<?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>
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-06-10 09:17:41

第三个模板不会在文档中选择任何<employee>元素。它只选择<employee>元素,这些元素是当前元素的直接子节点。在根级,这不适用于任何元素,但由于第一个元素中的<apply-templates>调用了第二个模板,而第二个模板使用(相对!)路径*/* (即当前元素的子元素的任何元素的模板),将选择<person>元素中的<employee>元素。

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

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

票数 -1
EN

Stack Overflow用户

发布于 2012-06-10 12:04:11

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

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

的东西是什么?

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

现在为employee,什么时候才能匹配那个小宝石呢?

那么,xslt处理程序不会遍历每个可能的节点,并查看它是否有匹配的模板。它只对你告诉它的节点这样做。

  • ,这就是你用xsl:apply-templates select='...'做的事情。
  • 为了使输入中的employee-nodes被xslt编辑,需要在某个xsl:apply-templates中选择它们。

Ok,那么发生了什么?在您的shop模板中,您选择了要应用模板的*/*,这意味着“当前节点的子节点的子节点”(如果您愿意的话)。

  • ( shop模板中的当前节点为shop )意味着选择person节点中的两个员工节点(*/*扩展为person/employee)。
  • Blake2是shop节点的同级节点,不被选中。
  • 更改为select*返回作为商店节点的子节点的personemployee节点。

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

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

玩得开心!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10967522

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档