使用xsl:key从匹配的子项中查找属性

时间:2011-04-28 16:24:08

标签: xml xslt xslkey

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中描述的方法,但没有运气。

任何提示?

2 个答案:

答案 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" />