2

我有一个带有参数 '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(mark) + 2(他的两个孩子)

我怎样才能做到这一点?这是我第一次使用 XSLT。

4

3 回答 3

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>
于 2012-09-25T19:49:52.860 回答
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>
于 2012-09-25T21:06:11.593 回答
1

使用这个单一的 XPath 表达式

count(/*/person) + count(/*/person/children/child)
于 2012-09-26T13:13:35.207 回答