使用 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部分currentDate
(only)。
你确定这是正确的吗?你为什么"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.0 版不接受 字符串序列 等结构
(比如('January','February',...)
),所以我使用了一系列子节点
相反。
这个变量的内容是Result Tree Fragment类型的,所以要
允许在 XPath 表达式中使用它,我不得不使用 exsl:node-set
函数。
这反过来需要在 transform
标签中放置额外的东西并导致
此脚本不再适用于 2.0 版本。
在模板匹配中root
我使用了Muenchian分组来输出
li
和 a
标签仅用于每个月的第一个博客,并已删除
从当前 Blog
元素打印 id
和 createDate
。
我有一个名为博客的文档类型 - 简而言之,内容节点下的所有内容都可以创建博客。随着这是博客的日期。我正在尝试使用 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部分currentDate
(only)。
你确定这是正确的吗?你为什么"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.0 版不接受 字符串序列 等结构 (比如
('January','February',...)
),所以我使用了一系列子节点 相反。这个变量的内容是Result Tree Fragment类型的,所以要 允许在 XPath 表达式中使用它,我不得不使用
exsl:node-set
函数。 这反过来需要在transform
标签中放置额外的东西并导致 此脚本不再适用于 2.0 版本。在模板匹配中
root
我使用了Muenchian分组来输出li
和a
标签仅用于每个月的第一个博客,并已删除 从当前Blog
元素打印id
和createDate
。