从XSLT中的键控结果中计算foreach的结果

时间:2014-05-27 18:28:26

标签: xml xslt

我有以下代码:

<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()函数。

我有一个条件,我需要这个计数值确定可能需要或可能不需要显示的其他数据。我唯一的另一个选择是检查特定值,如果提供其他代码,这将导致将来出现问题。

密钥确实为我提供了我正在寻找的独特值,因此可以按预期工作。

1 个答案:

答案 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 函数。