2

对 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——为了测试,我一直在研究所有glossterms。

我尝试创建一个单独的查找文档并使用 XML.com 中描述的方法:阅读多个输入文档但没有运气。

有什么提示吗?

4

2 回答 2

2

从您的描述中很难分辨,但我认为您想要这个

<xsl:key name="glossterm-lookup-key" match="glossentry/glossterm" use="text()" />

这将创建一个glossentry/glossterm以 child 文本为键的节点索引glossterm。那么参考是:

<xsl:value-of select="key('glossterm-lookup-key', .)/../@id" />

这使用当前上下文节点的文本来搜索索引并返回@id父节点。

于 2011-04-28T16:49:24.133 回答
0

除了@Jim Garrison 的正确答案,这是对您问题的解释。

来自http://www.w3.org/TR/xslt#key

use属性是指定键值的表达式;对于与模式匹配的每个节点,都会对表达式进行一次评估。

这意味着您的关键声明应该是:

<xsl:key name="glossterm-lookup-key" 
         match="glossentry/@id" 
         use="../glossterm" />  
于 2011-04-28T20:23:26.097 回答