如何编写XSL条件语句过滤XML公园数据并按规则应用模板
问题原因
你的原XSL存在两个核心错误:
- 模板匹配规则不匹配:你通过
<xsl:apply-templates select="parks/park">选中了所有公园节点,但你写的模板是匹配iceskating节点,两者没有对应关系,判断逻辑根本不会被触发。 - 上下文节点错误:如果模板上下文是
iceskating节点,你直接调用park_name、acres是取不到对应值的,这两个节点和iceskating是同级节点,都属于park的子元素。
修正后的完整XSL代码
<?xml version="1.0" encoding="UTF-8" ?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes" /> <xsl:template match="/"> <results> <iceskating_parks> <!-- 你也可以直接在select里加过滤条件,省略模板内的if判断:select="parks/park[iceskating > 0]" --> <xsl:apply-templates select="parks/park"> <xsl:sort select="park_name" order="ascending" /> </xsl:apply-templates> </iceskating_parks> </results> </xsl:template> <!-- 调整模板匹配为park节点,匹配apply-templates选中的节点 --> <xsl:template match="park" > <xsl:if test="iceskating > 0"> <park name="{park_name}" acres="{acres}" /> </xsl:if> </xsl:template> </xsl:stylesheet>
这里也简化了根节点下的元素写法,直接写节点名比用<xsl:element>更简洁易读,效果完全一致。
转换后输出结果
<?xml version="1.0" encoding="UTF-8"?> <results> <iceskating_parks> <park name="CORNELL (PAUL) SQUARE" acres="8.8"/> <park name="FULLER (MELVILLE)" acres="11.31"/> <park name="RUSSELL (MARTIN) SQUARE" acres="10.05"/> </iceskating_parks> </results>
完全符合你要求的格式,且已经按公园名称升序排序,只保留了可滑冰的公园。
内容的提问来源于stack exchange,提问作者ghostgif
相关产品推荐
相关产品推荐

