XSL转换XML文件时属性无值及排序功能异常问题咨询
问题原因
- 模板匹配规则不匹配:你通过
<xsl:apply-templates select="parks/park"/>选中了park节点,但写的模板只匹配park_name节点,导致park节点触发XSLT内置默认模板:递归处理所有子节点、自动输出文本节点内容,这就是多余的面积数值出现的原因。 - 节点上下文错误:触发
park_name匹配模板时,当前上下文是park_name元素本身,你在模板内写的select="park_name"和select="acres"都是从park_name节点下查找子元素,原XML中park_name没有这两个子元素,所以属性取值为空。 - 排序规则错误:你写的排序依据是
@name,但原XML的park节点没有name属性,实际排序需要取park下的park_name子元素值。
修正方案
直接修改XSLT文件内容如下即可得到符合要求的输出:
<?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> <names> <xsl:apply-templates select="parks/park"> <!-- 排序依据改为park下的park_name子元素值 --> <xsl:sort select="park_name" order="ascending" /> </xsl:apply-templates> </names> </results> </xsl:template> <!-- 模板改为匹配park节点,上下文直接为park元素 --> <xsl:template match="park"> <park name="{park_name}" acres="{acres}"/> </xsl:template> </xsl:stylesheet>
这里用了属性值模板{}的写法简化代码,和你原来写xsl:attribute的效果完全一致。
内容的提问来源于stack exchange,提问作者ghostgif
相关产品推荐
相关产品推荐

