1

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

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

我需要在同一个转换中打印 3,因为有 3 个子元素。

这可以做到吗?

谢谢。

4

2 回答 2

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-of并且string()仍然允许在 RTF 上使用)。

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

有关多通道处理的更多信息,请参阅两阶段处理:不要从阶段 1 XSLT 2.0 处理中输出空标签

于 2013-03-21T03:14:15.703 回答
0

如果您提供一些 XSLT 的摘录,将会有很大帮助。没有它,我不会给你 XSLT 代码。我会尝试给答案一些“方式”:

一种解决方案是将输出存储到节点集中(使用提供 nodeset() 函数的 XSLT 1.0 扩展)并在此变量上应用 XPath count() 函数。之后,只需使用 xsl:value-of 输出您的变量,您的计数结果也是一样的。

于 2013-03-21T00:48:04.360 回答