XSLT - “/。”是什么做?

时间:2013-05-11 09:00:53

标签: xml xslt xpath

我是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

2 个答案:

答案 0 :(得分:3)

使用XPath测试/.时发生了一些奇怪的事情,因为/.选择选择根节点,这不是一个元素。 XML的根元素是名为catalog根元素,是根节点/的唯一子元素。

它的工作方式与Unix文件路径相似(并且设计用于此目的),其中/是文件系统的根,/.也是如此,因为.只选择当前相对于上一步的节点。

同样,就像文件路径一样,相对 XPath依赖于上下文节点,因此如果在上下文节点中使用了.的XPath是child那么你会得到child。但是任何以斜杠开头的路径都是绝对路径,并从XML的根节点开始。其他地方的斜杠只是一个路径分隔符。

因此<xsl:value-of select="/."><xsl:value-of select="/">相同,并选择根节点的字符串值。在XPath Specification中,它说明了这个

  

根节点[或任何元素节点]的字符串值是文档顺序中...节点的所有文本节点后代的字符串值的串联

所以你得到了文件中的所有文字。

答案 1 :(得分:1)

/.的xpath表达式始终从根中选择(因为起始/)。然后从该节点及以下选择所有文本。

当您选择../时,您可以从当前节点中进行选择,这可能是您想要的。

相关问题