使用 XSLT 获取计数

Get count using XSLT

我有一个名为博客的文档类型 - 简而言之,内容节点下的所有内容都可以创建博客。随着这是博客的日期。我正在尝试使用 XSLT 计算每个月的博客数量,结果如下,但我的计数不正确?

<xsl:key name="MonthNo" match="Blog" use="substring(concat(currentDate, @createDate), 1,7)"/>

<xsl:template match="Blog" mode="month">
<xsl:variable name="DateBlog" select="concat(currentDate, @createDate)"/>
<xsl:variable name="YearBlog" select="substring-before($DateBlog, '-')"/>
<xsl:variable name="MonthBlog" select="substring($DateBlog,6,2)"/>
<xsl:variable name="BlogsInMonth" select="key('MonthNo', substring($DateBlog,1,7))"/>
<li>        
  <xsl:element name="a">
    <xsl:attribute name="href">
      <xsl:value-of select="umbraco.library:NiceUrl(1234)"/>?d=<xsl:value-of select="concat($MonthBlog, '-', $YearBlog)"/>
    </xsl:attribute>
    <xsl:value-of select="concat($monthNames[position()=$MonthBlog], ' (', count($BlogsInMonth),')')"/>
  </xsl:element>
</li>

谁能看出我哪里做错了或犯了什么错误?正在努力解决这个问题,因此我们将不胜感激。

您使用 key 函数获取特定月份博客数量的方式 是正确的。我创建了一个示例脚本,稍微更正了您的版本 (http://xsltransform.net/pNvs5vT),看看吧

来源 XML 包含 6 个 Blog 节点,一个创建于 9 月,两个创建于 10 月 11 月有 3 个,数字在输出中正确显示。

但我对你原来的剧本有一些疑问,也许是因为 您的脚本失败在其他地方。

让我们从您用来创建密钥的公式开始:

use="substring(concat(currentDate, @createDate), 1,7)"

据我所知,你:

  • 连接子元素 currentDate 和属性 createDate (我假设它们是 2 个日期,格式为 yyyy-mm-dd)。
  • 取上面字符串的前七个字符。

所以最后的结果是yyyy-mm部分currentDateonly)。 你确定这是正确的吗?你为什么"add"createDate? 它没有任何内容是最终子串的一部分。

请注意,在我的脚本中,我只采用了 单个 日期 - createDate 属性。 如果我的选择是错误的,那么将两个脚本中的 createDate 更改为 currentDate 和来源 XML.

脚本的另一个可能更重要的问题是您使用了 $monthNames[position()=$MonthBlog] 其中(至少在 xsltransform 下)生成错误消息: Cannot compare xs:integer to xs:string.

原因是$MonthBlog是一个字符串,但是需要比较的类型 position() 整数 。 在我的脚本中,我使用了 $monthNames[number($MonthBlog)],如您所见, 应用正确的转换和没有(在这种情况下默认)position().

还有最后一个重要问题:您没有指定 XSLT 的版本,所以我使用 版本 2.0.

所以总结一下:将我的 工作 脚本与你的进行比较,也许你会发现 您的脚本中存在一些错误。

编辑

我准备了另一个脚本,版本为1.0,见http://xsltransform.net/pNvs5vT/1

主要区别:

  1. 1.0 版不接受 字符串序列 等结构 (比如('January','February',...)),所以我使用了一系列子节点 相反。

  2. 这个变量的内容是Result Tree Fragment类型的,所以要 允许在 XPath 表达式中使用它,我不得不使用 exsl:node-set 函数。 这反过来需要在 transform 标签中放置额外的东西并导致 此脚本不再适用于 2.0 版本。

  3. 在模板匹配中root我使用了Muenchian分组来输出 lia 标签仅用于每个月的第一个博客,并已删除 从当前 Blog 元素打印 idcreateDate