Использование xsl:value-of в цикле for-each над xsl:variable

Это продолжение вопроса в записи 25317199.

В посте 25317199 данные имеют 2 блока, то есть Schools и FamilySmith. Данные в FamilySmith используются в качестве ключа для извлечения данных в школах.

Теперь, в этом случае, данные разделены в том, что FamilySmith теперь определен как переменная внутри таблицы стилей, как показано ниже:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:exsl="http://exslt.org/common"
    extension-element-prefixes="exsl"
    version="1.0">

    <xsl:variable name="FamilySmith">
        <Children>
            <Child>
                <Name>Thomas</Name>
                <School_Id>5489</School_Id>
            </Child>
            <Child>
                <Name>Andrew</Name>
                <School_Id>7766</School_Id>
            </Child>
        </Children>
    </xsl:variable>

    <xsl:template match="/Doc">
        <xsl:for-each select="exsl:node-set($FamilySmith)/Children/Child">
            <xsl:text>&#xa;</xsl:text>
            <xsl:value-of select="Name"/>
            <xsl:text> goes to (school's name here) </xsl:text>
            <xsl:value-of select="/Doc/Schools/School[Id = current()/School_Id]/Name"/>
            <xsl:text> at (school's address here) </xsl:text>
            <xsl:value-of select="/Doc/Schools/School[Id = current()/School_Id]/Address"/>
        </xsl:for-each>
    </xsl:template>
</xsl:stylesheet>

Это применяется к данным XML ниже:

<Doc>
    <Schools>
        <School>
            <Id>5489</Id>
            <Name>St Thomas</Name>
            <Address>High Street, London, England</Address>
        </School>
        <School>
            <Id>7766</Id>
            <Name>Anderson Boys School</Name>
            <Address>Haymarket, Edinborough</Address>
        </School>
    </Schools>
</Doc>

Оба поиска названия школы и адреса школы приводят к пустым строкам, как показано ниже.

Thomas goes to (school's name here)  at (school's address here) 
Andrew goes to (school's name here)  at (school's address here) 

Я использовал совет, данный в предыдущей публикации 25317199, т. Е. Используя current() для определения "текущего узла контекста вне предиката". Но, похоже, проблема в другом. Пожалуйста, порекомендуйте. Большое спасибо.

1 ответ

Решение

Проблема в том, что абсолютные пути начинаются с / разрешить относительно корневого узла дерева, содержащего текущий контекстный узел, который не обязательно является входным XML-документом. внутри

<xsl:for-each select="exsl:node-set($FamilySmith)/Children/Child">

путь /Doc/Schools ищет Doc элемент во временном документе, полученном из $FamilySmith (Итак value-of инструкции ничего не выбирают). Вы должны сохранить узел контекста снаружи for-each в другой переменной:

<xsl:template match="/Doc">
    <xsl:variable name="doc" select="." />
    <xsl:for-each select="exsl:node-set($FamilySmith)/Children/Child">
        <xsl:text>&#xa;</xsl:text>
        <xsl:value-of select="Name"/>
        <xsl:text> goes to (school's name here) </xsl:text>
        <xsl:value-of select="$doc/Schools/School[Id = current()/School_Id]/Name"/>
        <xsl:text> at (school's address here) </xsl:text>
        <xsl:value-of select="$doc/Schools/School[Id = current()/School_Id]/Address"/>
    </xsl:for-each>
</xsl:template>
Другие вопросы по тегам