自从我做了任何XSL以来已经有一段时间了,所以请原谅我,如果这有点令人困惑。
我有一个XML文件,我需要使用XSL进行转换。这一切都很有效,直到我尝试检测“类别”,因为每个项目都有多个“类别”节点。
XML文件的一部分:
<ROOT>
<blog day="20" id="4" live="201007200947" month="7" monthname="July" year="2010">
<blog_date><![CDATA[2010-07-20 09:47:00.0]]></blog_date>
<filepath><![CDATA[2010/20100720_4.htm]]></filepath>
<title><![CDATA[Blog title 1]]></title>
<category><![CDATA[Testing]]></category>
<category><![CDATA[Training]]></category>
<author_id><![CDATA[146]]></author_id>
<keywords/>
<summary><![CDATA[New British Gas Smart Metering recruits Paul Williams and Alex Egan give their first impressions.]]></summary>
</blog>
XSL文件样本
<xsl:template match="//ROOT">
<xsl:apply-templates select="//blog
[@live <= $ThisDate]
[not($AuthorId) or (author_id = $AuthorId)]
[not($BlogYear) or (not($BlogMonth) or (@month = $BlogMonth and @year = $BlogYear))]
[not($BlogCategory) or (translate(translate(category, $uppercase, $lowercase),$specialchar,'') = $BlogCategory)]
">
<xsl:sort value="blog_date" order="descending"/>
</xsl:apply-templates>
$ BlogCategory在网址中发送,并删除了所有特殊字符和空格(因此“类别”上的“翻译”)。
如果我按类别“测试”过滤XML,那么它可以正常工作,但如果我按类别“培训”排序则不返回任何值。我知道这是因为它只查看名为“category”的第一个节点,但有人可以建议修复吗?
我过去尝试过for-each循环,但是它有效但不理想因为position()总是等于1,所以在xsl文件中添加页面导航是不可能的。
理想情况下,我想要一个可以保留在apply-template中的修复程序。
我正在使用XSLT 2.0。
谢谢, 凯特
答案 0 :(得分:2)
您需要稍微更改过滤器。以下内容应该可以解决问题,因为它会选择所有blog
个节点,这些节点的子级category
的值会转换为$BlogCategory
的值:
category[translate(translate(., $uppercase, $lowercase),$specialchar,'') = $BlogCategory]]