首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用xsl:key从匹配的子级中查找属性

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

Stack Overflow用户
提问于 2011-04-29 00:24:08
回答 2查看 4.6K关注 0票数 2

这是XSL的新手,所以请原谅我的无礼之处。

我有一个输入XML文档(这实际上是Jargon File的文档形式,被显著地删减了):

代码语言:javascript
复制
<?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:

代码语言:javascript
复制
<?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>元素时,我都希望查找给定glossterm/text()glossentry/@id。所以,举个例子,如果我找到一个<glossterm>/dev/null</glossterm>,我想要获取dev-null

我只对glossdef中的glossterms感兴趣,但是我已经为所有那些东西准备了xsl:templates -为了测试,我一直在处理所有的glossterms。

我曾尝试创建一个单独的查找文档,并使用XML.com: Reading Multiple Input Documents中描述的方法,但没有成功。

有什么提示吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-04-29 00:49:24

从你的描述中很难看出,但我认为你想要这个

代码语言:javascript
复制
<xsl:key name="glossterm-lookup-key" match="glossentry/glossterm" use="text()" />

这将创建以子glossterm的文本为关键字的glossentry/glossterm节点的索引。然后,引用是:

代码语言:javascript
复制
<xsl:value-of select="key('glossterm-lookup-key', .)/../@id" />

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

票数 2
EN

Stack Overflow用户

发布于 2011-04-29 04:23:26

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

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

use属性是一个指定键的值的表达式;对于匹配模式的每个节点,该表达式都会计算一次。

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

代码语言:javascript
复制
<xsl:key name="glossterm-lookup-key" 
         match="glossentry/@id" 
         use="../glossterm" />  
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5821859

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档