无匹配XSLT模板时,文本字符为何会被输出?
当不存在匹配的XSLT模板时,为何文本(字符)会被输出?
XML示例
<?xml version="1.0" encoding="utf-8" ?> <base> <a> <b>B in a</b> </a> <c> <b>B in c</b> </c> </base>
XSLT示例
<stylesheet version="1.0" xmlns="http://www.w3.org/1999/XSL/Transform"> <output method="text"/> <template match="/a">Found it!</template> </stylesheet>
输出结果
B in a B in c
原因说明
这是因为XSLT内置了默认模板规则,当没有自定义模板匹配当前节点时,就会触发这些默认模板:
- 针对根节点和元素节点的默认模板:会自动递归处理该节点的所有子节点,继续尝试匹配子节点的模板
- 针对文本节点的默认模板:会直接输出文本内容
回到这个例子:
- XSLT里的模板
match="/a"是匹配根节点下的<a>元素,但XML的根节点是<base>,这个模板根本不会被触发 - 处理流程从根节点
<base>开始,因为没有匹配的自定义模板,触发元素默认模板,递归处理子节点<a>和<c> - 处理
<a>时同样没有匹配模板,继续递归处理其子节点<b>;<b>也没有匹配模板,递归处理里面的文本节点 - 文本节点触发默认模板,直接输出"B in a";同理
<c>下的文本节点也被输出,最终得到你看到的结果
内容的提问来源于stack exchange,提问作者tm1701
相关产品推荐
相关产品推荐

