在XPath表达式中使用Variable,输入元素具有前缀

时间:2014-07-28 23:57:22

标签: xml variables xslt xpath

我有3条员工记录如下。在我的XSLT中,我创建了一个行号为1,2和&的变量。 3然后循环遍历这些行中的每一行以打印fname。但它没有用。

下面是输入xml:

<tns:empLines>
    <tns:empLine>
        <can:fname>John</can:fname>
        <can:lname>Doe</can:lname>
        <can:age>20</can:age>
        <can:lineNumber>1</can:lineNumber>
    </tns:empLine>
    <tns:empLine>
        <can:fname>James</can:fname>
        <can:lname>Douglas</can:lname>
        <can:age>24</can:age>
        <can:lineNumber>2</can:lineNumber>
    </tns:empLine>
    <tns:empLine>
        <can:fname>Joe</can:fname>
        <can:lname>Sims</can:lname>
        <can:age>30</can:age>
        <can:lineNumber>3</can:lineNumber>
    </tns:empLine>
</tns:empLines>

以下是我的xslt:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format">
    <xsl:template match="/">
        <xsl:variable name="lines">
            <line num="1"/>
            <line num="2"/>
            <line num="3"/>
        </xsl:variable>
        <root>
            <xsl:for-each select="$lines/line">
                <pc>
                    <xsl:value-of select="//*[local-name()='empLines']/*[local-name()='empLine'][*[local-name()='lineNumber']=current()/@num]/*[local-name()='fname']/text()"/>
                </pc>
            </xsl:for-each>
        </root>
    </xsl:template>
</xsl:stylesheet>

1 个答案:

答案 0 :(得分:2)

在XSLT 1.0中,您显示的lines变量包含结果树片段而不是节点集,因此它不能在XPath中的/之前使用,如{ {1}}。有几种方法可以解决这个问题。

  1. 使用XSLT 2.0。
  2. 使用$lines/line扩展功能(不是普遍可移植的)将$行转换为节点集。
  3. node-set()的内容设置为样式表中的顶级元素,如下所示:
  4. -

    $lines

    请注意,顶级元素必须位于xsl之外的命名空间中。

    然而,michael非常正确,你展示的XML输入结构不正确(关于名称空间)。这应该是给你一个错误。