xsl:value-of xsl:for-each内部的行为

时间:2014-08-14 20:39:53

标签: xslt-1.0

当节点名称是同一文档中另一个节点的值时,我似乎在检索节点的值时遇到问题。让我来说明一下。

首先是文件:

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

我只想显示以下内容:   托马斯去英国伦敦高街的圣托马斯。   安德鲁去爱丁堡Haymarket的安德森男子学校

使用以下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>

但似乎表达/ Doc / Schools / School [Id = School_Id] ...不起作用,因为它每次都返回一个空值。结果如下。

托马斯去了  安德鲁去了

任何优惠请求?感谢。

1 个答案:

答案 0 :(得分:0)

您正在寻找current() function

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

您之前的尝试是寻找具有IdSchool_Id孩子具有相同价值的学校元素,而您实际想要的是将学校的ID与{{1}进行比较} School_Id的子节点,它是Child当前迭代的目标,即来自谓词之外的当前上下文节点。这是for-each给你的。