我只是在很短的时间内使用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>
</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)中,select将函数计算为字符串,而在(D)中,select将参数计算为字符串。为什么(B)中的函数不能评估为XXX?
我知道我在这里错过了一个重要的概念,但是几个小时的查看各种XSLT文档还没有回答。
非常感谢。
答案 0 :(得分:2)
key()
函数查找当前文档的密钥表,该表是当前节点的文档。
<xsl:for-each>
指令将当前节点定位到XPath地址中给出的节点,在您的情况下,由于document('')
调用,它位于样式表中。
因此,您使用<xsl:for-each>
来确保当前文档是调用时的样式表,以便使用的查找表是样式表的查找表而不是数据文件的查找表
在XSLT 2.0中,key()
有第三个参数,它是用作搜索查找表的子树(在任意树中)的顶点的节点。
我的XSLT书籍第319-323页上提供了有用的信息,可以在http://www.CraneSoftwrights.com/training/#ptux以“试用和购买”的形式免费下载...如果您决定不支付这本书的费用,请删除您免费下载的副本。