如何在XSL“apply-template”期间检测具有相同名称的XML节点的内容

时间:2010-08-05 09:29:21

标签: xml xslt

自从我做了任何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 &lt;= $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。

谢谢, 凯特

1 个答案:

答案 0 :(得分:2)

您需要稍微更改过滤器。以下内容应该可以解决问题,因为它会选择所有blog个节点,这些节点的子级category的值会转换为$BlogCategory的值:

category[translate(translate(., $uppercase, $lowercase),$specialchar,'') = $BlogCategory]]