我有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>
答案 0 :(得分:2)
在XSLT 1.0中,您显示的lines
变量包含结果树片段而不是节点集,因此它不能在XPath中的/
之前使用,如{ {1}}。有几种方法可以解决这个问题。
$lines/line
扩展功能(不是普遍可移植的)将$行转换为节点集。 node-set()
的内容设置为样式表中的顶级元素,如下所示:-
$lines
请注意,顶级元素必须位于xsl之外的命名空间中。
然而,michael非常正确,你展示的XML输入结构不正确(关于名称空间)。这应该是给你一个错误。