我是 XSLT 的新手,所以这个问题可能有点傻。有人可以向我解释一下这是怎么回事吗?
我有一个简单的 XML 文档(仅用于测试目的)及其样式表。
我不明白为什么
<xsl:value-of select="/.">
处理以下所有节点。我测试了“/”。 XPath 中的表达式,它仅选择名为 child
的节点。
此外,如果我将
/.
替换为 .
,它会给出预期的结果(仅输出名为 child
的节点的值)。
<?xml version="1.0" encoding="ISO-8859-1"?>
<?xml-stylesheet type="text/xsl" href="style.xsl"?>
<catalog title= "Catalog">
catalog
<cd price = "10">
<title>
title text
<child>child</child>
</title>
<artist>Bob Dylan</artist>
<country>USA</country>
<company>Columbia</company>
<year>1985</year>
</cd>
<cd price = "11">
<title>
second title text
<child>second child </child>
</title>
<artist>Bob Dylan2</artist>
<country>USA2</country>
<company>Columbia2</company>
</cd>
</catalog>
样式表:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" media-type="text/html"/>
<xsl:template match="/">
<html>
<head>
<title> <xsl:value-of select="/catalog/@title" /> </title>
</head>
<body>
<xsl:apply-templates select="/catalog/cd/title"/>
</body>
</html>
</xsl:template>
<xsl:template match="child">
<b>
<xsl:value-of select="/.">
</xsl:value-of>
</b>
<br/>
</xsl:template>
</xsl:stylesheet>
结果:
title text catalog title text child Bob Dylan USA Columbia 1985 second title text second child Bob Dylan2 USA2 Columbia2
second title text catalog title text child Bob Dylan USA Columbia 1985 second title text second child Bob Dylan2 USA2 Columbia2
当您使用 XPath 测试
/.
时,发生了一些奇怪的事情,因为 /.
选择选择了 根节点,它不是一个元素。 XML 的 root 元素 是名为 catalog
的元素,并且是根节点 /
的唯一子元素。
它的工作方式很像 Unix 文件路径(并且旨在这样做),其中
/
是文件系统的根,/.
也是如此,因为 .
只是选择相对于上一步的当前节点。
再次强调,就像文件路径一样,relative XPath 取决于 context 节点,因此,如果您在上下文节点为
.
时使用了 child
的 XPath,那么您将得到 child
。但任何以斜线开头的路径都是“绝对”路径,并且从 XML 的根节点开始。其他任何地方的斜杠只是路径分隔符。
所以 <xsl:value-of select="/.">
与
<xsl:value-of select="/">
相同,选择根节点的字符串值。在 XPath 规范中这样说 根节点[或任何元素节点]的字符串值是...节点的所有文本节点后代的字符串值按文档顺序串联
这样你就得到了文档中的所有文本。
/.
的 xpath 表达式始终从根中选择(因为以
/
开头)。然后选择该节点及其下方的所有文本。当您选择
.
或
./
时,您可以从 current节点中进行选择,这可能就是您想要的。