3

我是 XSLT 的新手,所以这个问题可能有点傻。有人可以向我解释这里发生了什么吗?

我有一个简单的 XML 文档(仅用于测试目的)及其样式表。

我不明白为什么要<xsl:value-of select="/.">处理所有以下节点。我测试了“/。” XPath 中的表达式,它只选择名为child.

另外,如果我用它替换/..会给出预期的结果(仅输出 node named 的值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
4

2 回答 2

4

/.当您使用 XPath进行测试时,发生了一些奇怪的事情,因为/.selects 选择了根节点,它不是一个元素。XML的根元素是已命名的元素,catalog并且是根节点的唯一子节点/

它的工作方式很像 Unix 文件路径(并且旨在这样做),/文件系统的根在哪里,/.因为它只.选择相对于上一步的当前节点。

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

so与选择根节点的字符串值<xsl:value-of select="/.">相同。<xsl:value-of select="/">XPath 规范中它这样说

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

所以你得到了文档中的所有文本。

于 2013-05-11T11:12:14.397 回答
1

一个 xpath 表达式/.总是从根中选择(因为从 开始/)。然后从该节点及以下选择所有文本。

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

于 2013-05-11T09:10:56.340 回答