[英]XSL and XPATH issue match
我有这个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>
我得到空页(只有标签li
的黑点)。 你能解释一下我的区别吗?
如果您想了解XSL转换的功能,请使用可以显示实际结果代码的工具(例如xsltransform.net)-而不是浏览器。 – michael.hor257k
我对此非常同意,例如使用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
元素的第一个子节点-这是仅包含空格的文本节点 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.