我有一个带有参数'numberOfRecords'的预告片记录的模板。
<xsl:template name="render-FileTrailer">
<xsl:param name="fileRecordIdentifier" select="TR"/>
<xsl:param name="numberOfRecords"/>
</xsl:template>
此数字应该是我的父记录及其所有子记录的总计数。一个例子是
<people>
<person>
<name> Mark</name>
<age>32</age>
<children>
<child>
<name> Mark Jr.</name>
<age> 2</age>
</child>
<child>
<name> Angel</name>
<age> 4</age>
</child>
</children>
</person>
</people>
所以这将返回3,1(标记)+ 2(他的两个孩子)
我该怎么做?这是我第一次使用XSLT。
答案 0 :(得分:3)
由于您说您是XSLT新手,可能会有一些您感到困惑的事情:-) fileRecordIdentifier
和numberOfRecords
参数的预期用途尚不清楚。在任何情况下,您都不能使用它们从模板返回值; XSLT无法正常工作。我会尽可能地回答我现在提出的问题。
下面的样式表将调用您的模板,该模板会添加所有人员元素和所有子元素的数量。结果将只是“3”(顺便说一下,不是有效的XML)。但是,在根模板中也可以这样做,因此最好澄清render-FileTrailer
模板的预期用途。如果你在某种程度上详细说明这个问题,我们可以进一步研究。
作为旁注,您的XML文件缺少某些结束标记中的/
。
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:template match="/">
<xsl:call-template name="render-FileTrailer"/>
</xsl:template>
<xsl:template name="render-FileTrailer">
<xsl:sequence select="count(//people) + count(//child)"/>
</xsl:template>
</xsl:stylesheet>
答案 1 :(得分:1)
您可以使用以下XPath获取文档中所有人员和子元素的计数:
count(//person|//child)
应用于您的模板,它将为numberOfRecords参数创建默认值:
<xsl:template name="render-FileTrailer">
<xsl:param name="fileRecordIdentifier" select="TR"/>
<xsl:param name="numberOfRecords" select="count(//person|//child)"/>
</xsl:template>
或者您可以在调用模板时指定该值,如下所示:
<xsl:call-template name="render-FileTrailer">
<xsl:with-param name="numberOfRecords" select="count(//person|//child)"/>
</xsl:call-template>
答案 2 :(得分:1)
使用此单个XPath表达式:
count(/*/person) + count(/*/person/children/child)