2013-03-20 46 views
1

我正在尝试计算我的转换生成的元素(必须使用XLST1)。例如,我的转换创建:计算在XSLT1中生成的元素

<Parent> 
    <ElementX Att1="2"/> 
    <ElementY Att1="1"/> 
    <ElementZ Att1="6"/> 
</Parent> 

我需要在同一改造内打印3,因为有3个元素。

可以这样做吗?

谢谢。

+0

那么你的转型是什么样子? – JLRishe 2013-03-20 15:22:24

+0

请修改您的帖子以包含整个模板,并至少包含调用该模板的模板。 – JLRishe 2013-03-20 15:35:13

回答

0

如果您提供了一些XSLT的提取,这将有很大的帮助。 我不给它一个XSLT代码。我将尝试给出一些“方法”来回答:

一种解决方案可能是将输出存储到nodeset(使用提供nodeset()函数的XSLT 1.0扩展)并应用XPath count()函数在这个变量上。之后,只需使用xsl:value-of输出变量,并以相同的方式计算结果。

0

这里是一个演示如何做到这一点

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:ext="http://exslt.org/common" exclude-result-prefixes="ext"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 

<xsl:template match="/"> 
    <xsl:variable name="vrtfPass1"> 
    <xsl:apply-templates/> 
    </xsl:variable> 

    <xsl:value-of select="count(ext:node-set($vrtfPass1)/*/*)"/> 
</xsl:template> 

<xsl:template match="/*"> 
    <Parent> 
     <ElementX Att1="2"/> 
     <ElementY Att1="1"/> 
     <ElementZ Att1="6"/> 
    </Parent> 
</xsl:template> 
</xsl:stylesheet> 

当这种转变是在任何XML文档(在此演示没有使用),想要的,正确的结果是产生应用:

3 

说明

处理变换结果(在单个变换中)的一般方法是将它组织成,两次传入,我们将第一次传递的结果保存在变量中。

在第二步中,我们访问结果并执行附加处理。

请注意,在XSLT 1.0中,如果捕获第一遍结果的变量是臭名昭着的RTF(结果树片段)类型,并且需要按照此树中的任何节点的顺序转换为常规树可以访问(xsl:copy-ofstring()仍然可以在RTF上使用)。

此转换为常规树由扩展函数完成,扩展函数通常具有名称node-set并始终属于供应商定义的名称空间。在这个演示中,我们使用属于EXSLT命名空间的node-set()扩展函数 - 因为大多数XSLT 1.0处理器都实现EXSLT。

有关多通道处理的详细信息,请参阅本Two phase processing: Do not output empty tags from phase-1 XSLT 2.0 processing