计算XSLT文件中的记录

时间:2012-09-25 19:11:51

标签: .net xml xslt file-processing

我有一个带有参数'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。

3 个答案:

答案 0 :(得分:3)

由于您说您是XSLT新手,可能会有一些您感到困惑的事情:-) fileRecordIdentifiernumberOfRecords参数的预期用途尚不清楚。在任何情况下,您都不能使用它们从模板返回值; 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)