XSLT循环变量时无法读取源XML标签值的解决方法问询
XSLT 2.0 循环映射变量无法获取源XML标签值的修复方案
核心问题:上下文节点切换错误
循环attrMapping变量时,当前上下文是映射节点(而非源XML的<rootTag>),直接用相对路径无法定位到源节点的子标签,导致输出空的<Value>。
具体修改步骤
1. 提前捕获源XML的目标节点
在XSLT开头先定义变量获取源XML中<rootTag>节点,避免循环时上下文混乱:
<xsl:variable name="sourceRoot" select="/MainTag/rootTag"/>
2. 循环映射变量时,切换上下文到源节点
假设你的attrMapping定义类似:
<xsl:variable name="attrMapping"> <map from="Tag1A" to="ValueA"/> <map from="Tag1B" to="ValueB"/> <map from="Tag1C" to="ValueC"/> <map from="Tag1D" to="ValueD"/> </xsl:variable>
循环时,通过$sourceRoot结合映射的from属性定位源标签:
<xsl:for-each select="$attrMapping/map"> <Value> <!-- 用XPath根据映射的标签名获取源节点文本 --> <xsl:value-of select="$sourceRoot/*[local-name() = current()/@from]"/> <!-- 或者XSLT 2.0支持的简化写法:直接构造节点名 --> <!-- <xsl:value-of select="$sourceRoot/{@from}"/> --> </Value> </xsl:for-each>
3. 避免直接输出映射属性值
错误写法(直接输出字符串而非节点文本):
<!-- 错误:这只会输出"Tag1A"字符串,而非对应标签的文本 --> <Value><xsl:value-of select="@from"/></Value>
必须通过XPath选择源XML中的对应元素,才能拿到实际文本内容。
内容的提问来源于stack exchange,提问作者Sharma_Abhinav
相关产品推荐
相关产品推荐

