在xsl:变量中使用for-each循环中的xsl:value-of

时间:2014-08-17 15:33:40

标签: xslt-1.0 xsl-variable

这是条目25317199中问题的续集。

在25317199帖子中,数据有2个块,即 Schools FamilySmith FamilySmith 中的数据用作检索 Schools 中数据的密钥。

现在,在这种情况下,数据被分割为 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()从谓词外部识别&#34;当前上下文节点。&#34;但似乎问题出在其他地方。请指教。非常感谢。

1 个答案:

答案 0 :(得分:0)

问题是以/开头的绝对路径是相对于包含当前上下文节点的树的根节点解析的,该节点不一定是输入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>