XSLT 1.0中存储XML节点列表到变量失败问题求助
问题解决:XSLT 1.0 中正确获取 Locations 下的 Location 文本到变量
核心问题分析
你遇到的变量为空问题,本质是节点选择的上下文路径错误。调试时看到的 */text() 有内容,大概率是调试时的上下文处于 <Locations> 节点下,但变量定义时的当前上下文并非该节点,导致路径匹配不到目标文本。
解决方案
1. 存储节点集(保留所有独立的文本节点)
如果需要保留每个 <Location> 的文本作为独立节点(后续可遍历处理),需确保选择路径与当前上下文匹配:
- 若当前上下文是根节点(比如模板匹配
/):
<xsl:variable name="my_locations" select="/Locations/Location/text()"/>
- 若当前上下文已经是**
<Locations>节点**(比如模板匹配Locations):
<xsl:variable name="my_locations" select="Location/text()"/>
测试验证:可以通过遍历变量输出内容确认:
<xsl:for-each select="$my_locations"> <span>位置:<xsl:value-of select="."/></span> </xsl:for-each>
2. 拼接为单个字符串(如逗号分隔)
如果需要将所有位置文本合并成一个字符串(XSLT 1.0 无原生字符串拼接函数,需手动处理):
<xsl:variable name="my_locations_str"> <xsl:for-each select="Locations/Location"> <!-- 非第一个元素前加逗号分隔 --> <xsl:if test="position() > 1">,</xsl:if> <xsl:value-of select="text()"/> </xsl:for-each> </xsl:variable>
关键注意点
- XSLT 1.0 中,
<xsl:variable>的select属性仅能选择节点集,若要生成字符串需用内容模板(如上述拼接示例)。 - 始终确保节点选择路径的上下文正确性,避免使用模糊的
*/text(),改用明确的层级路径(如Locations/Location/text())减少歧义。
内容的提问来源于stack exchange,提问作者Adhil
相关产品推荐
相关产品推荐

