【问题标题】:Using xsl:key to find an attribute from a matched child使用 xsl:key 从匹配的子项中查找属性
【发布时间】:2011-04-28 16:24:07
【问题描述】:

对 XSL 相当陌生 - 所以请见谅。

我有一个输入的 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>

我的目标是,每当我遇到&lt;glossterm&gt; 元素时,我都想在给定glossterm/text() 的情况下查找glossentry/@id。因此,例如,如果我找到&lt;glossterm&gt;/dev/null&lt;/glossterm&gt;,我想获得dev-null。

我只对glossterms 中的glossterms 真正感兴趣,但我已经为所有这些东西工作了xsl:templates - 为了测试,我一直在研究所有glossterms。

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

有什么提示吗?

【问题讨论】:

    标签: xml xslt xslkey


    【解决方案1】:

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

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

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

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

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

    【讨论】:

    • 谢谢!我实际上已经尝试过与此非常相似的东西——我相信我只是没有使用正确的“使用”键。感谢您的帮助。
    【解决方案2】:

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

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

    use 属性是一个表达式 指定键的值;这 表达式为每个计算一次 匹配模式的节点。

    这意味着您的密钥声明应该是:

    <xsl:key name="glossterm-lookup-key" 
             match="glossentry/@id" 
             use="../glossterm" />  
    

    【讨论】:

      猜你喜欢
      • 2022-01-02
      • 1970-01-01
      • 2021-09-15
      • 1970-01-01
      • 2019-10-21
      • 2023-03-08
      • 1970-01-01
      • 1970-01-01
      • 2020-06-20
      相关资源
      最近更新 更多