XSL相当新 - 所以请原谅noobishness。
我有一个输入XML文档(这实际上是Jargon File的docbook形式,显着地剪断了):
<?xml version="1.0" encoding="ISO-8859-1"?>
<glossary>
<glossdiv id='glossdiv-0'>
<title>0</title>
<glossentry id='dev-null'>
<glossterm>/dev/null</glossterm>
<glossdef>
snip...
<glossterm>bit bucket</glossterm>
</glossdef>
</glossentry>
<glossentry id='me'>
<glossterm>/me</glossterm>
<glossdef>
snip...
<glossterm>/dev/null</glossterm>
</glossdef>
</glossentry>
</glossdiv>
</glossary>
这是我一直在使用的测试XSL:
<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xalan="http://xml.apache.org/xalan"
version="2.0">
<xsl:output indent="yes" xalan:indent-amount="5" />
<xsl:template match="text()" />
<xsl:key name="glossterm-lookup-key" match="glossentry/@id" use="glossentry/glossterm" />
<xsl:template match="glossary" >
<xsl:apply-templates />
</xsl:template>
<xsl:template match="glossterm">
Key: <xsl:value-of select="." />
Value: <xsl:value-of select="key('glossterm-lookup-key', .)" />
<xsl:text>
</xsl:text>
</xsl:template>
</xsl:stylesheet>
我的目标是,无论何时遇到<glossterm>
元素,我都希望在给定glossentry/@id
的情况下查找glossterm/text()
。因此,例如,如果我找到<glossterm>/dev/null</glossterm>
,我想获得dev-null
。
我只对glossdef中的glossterms感兴趣,但是我为所有这些东西都使用了xsl:templates - 为了测试我刚刚开始研究所有的光泽。
我尝试创建一个单独的查找文档并使用XML.com: Reading Multiple Input Documents中描述的方法,但没有运气。
任何提示?
答案 0 :(得分:2)
从你的描述中说出来有点难,但我想你想要这个
<xsl:key name="glossterm-lookup-key" match="glossentry/glossterm" use="text()" />
这会在子glossentry/glossterm
的文本上创建一个glossterm
个节点的索引。那么参考是:
<xsl:value-of select="key('glossterm-lookup-key', .)/../@id" />
这使用当前上下文节点的文本来搜索索引并返回父级的@id
。
答案 1 :(得分:0)
除了@Jim Garrison的正确答案,这是对你问题的解释。
来自http://www.w3.org/TR/xslt#key
use
属性是一个表达式 指定密钥的值;该 表达式每次评估一次 与模式匹配的节点。
这意味着您的密钥声明应为:
<xsl:key name="glossterm-lookup-key"
match="glossentry/@id"
use="../glossterm" />