我有以下代码:
<xsl:key name="propRecType" match="RecordType" use="."/>
<xsl:template name="DisplayCodeCount">
<xsl:variable name="TypeRecords" >
<xsl:for-each select="Records/Record/ReportRecords/ReportRecord/RecordType[generate-id() = generate-id(key('propRecType', .))]">
<xsl:copy-of select="."/>
</xsl:for-each>
</xsl:variable>
<div>
Test<br/>
<xsl:value-of select="$TypeRecords"/>
<xsl:value-of select="count($TypeRecords)"/>
</div>
</xsl:template>
问题是count函数抛出以下异常:
System.Xml.Xsl.XslTransformException:在中使用结果树片段 路径表达式,首先使用它将其转换为节点集 msxsl:node-set()函数。
我有一个条件,我需要这个计数值确定可能需要或可能不需要显示的其他数据。我唯一的另一个选择是检查特定值,如果提供其他代码,这将导致将来出现问题。
密钥确实为我提供了我正在寻找的独特值,因此可以按预期工作。
答案 0 :(得分:1)
问题在于,由于您正在创建节点副本, TypeRecords 持有“结果树片段”,并且您无法将XPath导航应用于此类变量。
现在,您可以使用扩展功能将结果树片段转换为节点集。这涉及声明相关的命名空间
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:exsl="http://exslt.org/common">
然后,当您想要访问变量
时,可以使用 node-set 功能 <xsl:value-of select="exsl:node-set($TypeRecords)"/>
<xsl:value-of select="count(exsl:node-set($TypeRecords)/RecordType)"/>
有关信息,请参阅http://www.xml.com/pub/a/2003/07/16/nodeset.html。
但是......在这种情况下,不需要使用 node-set 功能。只需将变量声明更改为:
<xsl:variable name="TypeRecords"
select="Records/Record/ReportRecords/ReportRecord/RecordType[generate-id() = generate-id(key('propRecType', .))]" />
该变量现在直接引用源XML中的节点,而不是创建副本。因为有源节点,所以可以正常使用xpath函数,而不需要 node-set 函数。