0

我只使用 XSLT 很短的时间,我有一个概念问题。

我有一个 XML 文件:

<?xml version="1.0"?>
<root>AAA - BBB</root>

和一个 XSLT 文件

<xsl:output method="text"/>

<xsl:param name="DATA" select="999"/>

<lookup:strings>
    <string id='eee'>XXX</string>
    <string id='fff'>YYY</string>
</lookup:strings>

<xsl:key name='look' match='lookup:strings/string' use='@id' />

<xsl:variable name='strings' select='document("")//lookup:strings' />

<xsl:template match="/">
    <xsl:text>$strings=</xsl:text>
    <xsl:value-of select="$strings"/>
    <xsl:text>&#xa;</xsl:text>
    <xsl:text>(A)</xsl:text>
    <xsl:for-each select='$strings'>
        <xsl:value-of select='key("look", "eee")'/>
    </xsl:for-each>
    <xsl:text>(B)</xsl:text>
    <xsl:value-of select='key("look", "eee")'/>
    <xsl:text>(C)</xsl:text>
    <xsl:value-of select="substring-before(.,' - ')"/>
    <xsl:text>(D)</xsl:text>
    <xsl:value-of select="$DATA"/>
</xsl:template>

这将产生输出:

$strings= XXX YYY 
(A)XXX(B)(C)AAA(D)999

问题:

为什么键查找需要 (A) 中的 for-each 才能产生输出?在 (C) 中,选择将函数评估为字符串,在 (D) 中,选择将参数评估为字符串。为什么 (B) 中的函数不计算为 XXX?

我知道我在这里遗漏了一个重要概念,但是查看各种 XSLT 文档的几个小时并没有得到答案。

非常感谢。

4

1 回答 1

2

key()函数查找当前文档的键表,即当前节点的文档。

该指令将当前节点定位到 XPath 地址中给定的节点,在您的情况下,由于调用<xsl:for-each>,该地址位于样式表中。document('')

因此,您正在使用<xsl:for-each>确保当前文档是调用时的样式表,以便使用的查找表是样式表的查找表,而不是数据文件的查找表。

在 XSLT 2.0 中,第三个参数key()是用作子树(在任意树中)的顶点的节点,在其中搜索查找表。

在我的 XSLT 书籍的第 319-323 页上有有用的信息,可以在http://www.CraneSoftwrights.com/training/#ptux上以“试用并购买”的方式免费下载...如果您决定不为书付费,请删除您免费下载的副本。

于 2013-09-12T16:24:47.947 回答