我有这个XML文件:
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="cd.xsl"?>
<produce>
<item>apple<x>kk</x><y>jj</y></item>
<item>banana<x>aaa</x></item>
<item>pepper<x>qqq</x></item>
</produce>
这个xls文件:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
<xsl:output method="html"/>
<xsl:template match="/">
<html>
<body>
<ul>
<li><xsl:value-of select="node()"/></li>
</ul>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
我不明白“/”和“/*”匹配之间的区别,因此我要进行各种测试,例如上面的测试,我得到:
type="text/xsl" href="cd.xsl"
我也不明白为什么(我希望
produce
标签)。但是,如果使用此xls文件:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
<xsl:output method="html"/>
<xsl:template match="/*">
<html>
<body>
<ul>
<li><xsl:value-of select="node()"/></li>
</ul>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
我得到了空页面(只有标签的黑点)。
你能解释一下这些区别吗?
最佳答案
如果您想了解xsl转换的功能,可以使用一个工具来显示实际生成的代码(例如xsltransform.net),而不是浏览器。–迈克尔·霍尔257K
我非常同意这一点,例如使用http://xsltransform.net/。
tl;dr:/
是文档节点,/*
是输入文档的最外层元素
从第一个样式表得到的输出是
<html>
<body>
<ul>
<li>type="text/xsl" href="cd.xsl"</li>
</ul>
</body>
</html>
我明白为什么你会感到惊讶。让我们看一看xslt代码,其中匹配了文档节点:
<xsl:template match="/">
在此模板中,您对输入文档的唯一引用是
<xsl:value-of select="node()"/>
它选择第一个节点的值,该节点是文档节点的子节点(
/
)。实际上,node()
是一组节点,但在xslt 1.0中,在这样的上下文中,只使用这样一组节点中的第一个项。那么,什么是节点?在XML文档模型(如XDM)中,有许多不同类型的节点,其中包括:元素节点、属性节点、处理指令。现在看看您的输入文档:
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="cd.xsl"?>
<produce>
<item>apple<x>kk</x><y>jj</y></item>
<item>banana<x>aaa</x></item>
<item>pepper<x>qqq</x></item>
</produce>
第一行是XML声明,它不是文档的一部分。第二行是一条处理指令,它告诉浏览器在哪里查找xslt样式表。处理指令是文档的一部分。
此处理指令是文档节点的第一个子节点-这就是为什么将其内容作为
<xsl:value-of select="node()"/>
因此,如果从输入文档中删除处理指令,则输出将如下所示
<html>
<body>
<ul>
<li>
applekkjj
bananaaaa
pepperqqq
</li>
</ul>
</body>
</html>
因为现在,
produce
元素是/
的第一个子节点。结果是produce
元素的字符串值。另一方面,如果模板匹配
/*
,则输出不是空页,而是<html>
<body>
<ul>
<li>
</li>
</ul>
</body>
</html>
/*
表示xml文档的最外层元素,在本例中为produce
。现在,produce
元素是xsl:value-of
的上下文:<xsl:value-of select="node()"/>
同样,这将选择
produce
元素的第一个子节点,它是一个只包含空白的文本节点。