Использование xsl: key для поиска атрибута из сопоставленного дочернего элемента - PullRequest
2 голосов
/ 28 апреля 2011

Совершенно новичок в XSL - так что, пожалуйста, прости нубишизм.

У меня есть входной XML-документ (на самом деле это документальная форма файла Jargon , значительно оторванная):

<?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.

Меня действительно интересуют только glossterms в glossdef, но у меня есть xsl: шаблоны для всего этого - ради тестирования, я только что работал над всеми glossterms.

Я попытался создать отдельный справочный документ и использовать подход, описанный на XML.com: чтение нескольких входных документов , но мне не повезло с этим.

Есть подсказки?

Ответы [ 2 ]

2 голосов
/ 28 апреля 2011

Сложно сказать по вашему описанию, но я думаю, что вы хотите это

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

Это создает индекс из glossentry/glossterm узлов, введенных в текст дочернего элемента glossterm. Ссылка тогда:

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

Использует текст текущего узла контекста для поиска в индексе и возвращает @id родительского элемента.

0 голосов
/ 29 апреля 2011

Помимо правильного ответа @Jim Garrison, это объяснение вашей проблемы.

From http://www.w3.org/TR/xslt#key

Атрибут use является выражением, определяющим значенияключ;выражение вычисляется один раз для каждого узла, соответствующего шаблону.

Это означает, что ваше объявление ключа должно быть:

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