为什么这句话不:
apply-templates select="*/* ( XSLT文件中的"shop“元素)
将粗体格式应用于Blake2?输出如下所示:
XSLT中根的
起始
“步骤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>发布于 2012-06-10 09:17:41
第三个模板不会在文档中选择任何<employee>元素。它只选择<employee>元素,这些元素是当前元素的直接子节点。在根级,这不适用于任何元素,但由于第一个元素中的<apply-templates>调用了第二个模板,而第二个模板使用(相对!)路径*/* (即当前元素的子元素的任何元素的模板),将选择<person>元素中的<employee>元素。
第二个<employee>元素不是<shop>元素的子元素,而是<shop>元素的直接子元素,因此*/*不会从<shop>开始选择。
当您将*/*更改为*时,两个<employee>元素都会被选中:第二个元素被选中,因为它与* (<shop>的直接子元素)直接匹配。*还选择<person>,由于没有为该元素指定模板,因此将执行默认行为,这意味着模板将应用于<person>的子级,其中包括第一个<employee>元素。
发布于 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)。shop节点的同级节点,不被选中。select的*返回作为商店节点的子节点的person和employee节点。那么非粗体的Blake2 是从哪里来的呢?,非粗体的Blake2并不来自您创建的任何模板,他只是默认行为的受害者,在默认行为中,文本节点而不是元素节点被从输入复制到输出。
如果您想真正使用xslt,您需要学习一些东西。我建议从身份转换开始(谷歌是你的朋友),然后为它们提供一个空模板来删除一些元素。而不是一对一的翻译,比方说,大写所有元素。混合属性。尝试使用xpath条件([this stuff])进行更严格的匹配。查看更复杂的结构,如条件和循环结构。深入研究变量、参数和调用模板。使用文档()。
玩得开心!
https://stackoverflow.com/questions/10967522
复制相似问题