XPath/XSLT无结果返回:获取汽车名称列表的正确表达式
问题分析与解决方案
你的问题出在命名空间的处理上:
- XML根元素
<getCarResponse>属于http://cars-collections.azurewebsites.net/命名空间,但<Rows>标签通过xmlns=""重置了默认命名空间,导致其下的<Car>和<Car_name>都不属于任何命名空间。 - 原XSLT中用
//cars:Car查找元素,相当于在cars命名空间下搜索Car,自然找不到匹配节点,所以没有输出结果。
正确的XPath表达式
- 遍历所有Car元素的精准路径:
或者用通用匹配(适合不确定层级的情况):/cars:getCarResponse/cars:getCarResult/Rows/Car//*[local-name()='Car'] - 在
<xsl:for-each>内部获取当前Car对应的名称,用相对路径:Car_name
修正后的完整XSLT代码
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:form="http://forms.com/forms" xmlns:cars="http://cars-collections.azurewebsites.net/" exclude-result-prefixes="form cars"> <xsl:template match="/"> <form:form-data> <form:field> <form:name>cars</form:name> <form:options> <xsl:for-each select="/cars:getCarResponse/cars:getCarResult/Rows/Car"> <form:option> <form:label> <xsl:value-of select="Car_name"/> </form:label> <form:value> <xsl:value-of select="Car_name"/> </form:value> </form:option> </xsl:for-each> </form:options> </form:field> </form:form-data> </xsl:template> </xsl:stylesheet>
关键说明
- 外层的
getCarResponse和getCarResult必须带cars:前缀,因为它们属于目标命名空间; Rows、Car、Car_name无命名空间,直接写元素名即可;- for-each内部用相对路径
Car_name,确保每次只取当前循环的Car元素下的名称,避免全局匹配重复输出。
内容的提问来源于stack exchange,提问作者adam78
相关产品推荐
相关产品推荐

