Поведение xsl:value-of внутри xsl:for-each

Кажется, у меня проблемы с получением значения узла, когда имя узла является значением другого узла в том же документе. Позвольте мне проиллюстрировать.

Сначала документ:

<?xml version="1.0" encoding="UTF-8"?>
<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>
    <FamilySmith>
        <Children>
            <Child>
                <Name>Thomas</Name>
                <School_Id>5489</School_Id>
            </Child>
            <Child>
                <Name>Andrew</Name>
                <School_Id>7766</School_Id>
            </Child>
        </Children>
    </FamilySmith>
</Doc>

Я просто хочу показать следующее: Томас едет в Сент-Томас на Хай-стрит, Лондон, Англия. Эндрю ходит в школу мальчиков Андерсона в Хеймаркет, Эдинборо

Using the folollowing xsl:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    version="1.0">
        <xsl:output method="text"/>

        <xsl:template match="/Doc">
        <xsl:apply-templates select="FamilySmith"/>
    </xsl:template>

    <xsl:template match="FamilySmith">
        <xsl:for-each select="Children/Child">
            <xsl:text>&#xa; </xsl:text>
            <xsl:value-of select="Name"/>
            <xsl:text> goes to </xsl:text>
            <xsl:value-of select="/Doc/Schools/School[Id = School_Id]/Name"/>
            <xsl:text> at </xsl:text>
            <xsl:value-of select="/Doc/Schools/School[Id = School_Id]/Address"/>
        </xsl:for-each>
    </xsl:template>
</xsl:stylesheet>

But it seems that the expression /Doc/Schools/School[Id = School_Id]... does not work as it returns an empty value each time. The results are given below.

Thomas goes to at Andrew goes to at

Any offers pleaese? Благодарю.

1 ответ

Решение

Вы ищете current() функция:

<xsl:value-of select="/Doc/Schools/School[Id = current()/School_Id]/Name"/>

Ваша предыдущая попытка найти элементы школы, которые имеют Id и School_Id ребенок, который имеет ту же ценность, в то время как вы действительно хотите сравнить идентификатор школы с School_Id дитя Child это цель текущей итерации for-eachт.е. текущий узел контекста вне предиката. Это то, что current() дает тебе.

Другие вопросы по тегам