You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

XSLT新手求助:遍历节点集变量并引用元素构建新节点集

解决XSLT中动态遍历节点并匹配对应元素的问题

嘿,作为XSLT新手碰到这种动态节点匹配的问题太正常啦,我来帮你把代码改对~

你当前的思路是对的:先拿到所有表头的attrname值,再遍历每个值去取对应行数据里的元素。但问题出在用变量直接作为节点名称这一步——XSLT 1.0里没法直接这么写,变量会被当作字符串处理,而不是节点名。咱们得换个方式匹配元素名。

修正后的代码示例

<xsl:variable name="vHeaders" select="DATAPACKET/METADATA/FIELDS/*/@attrname"/>

<xsl:for-each select="$vHeaders">
    <!-- 当前循环的节点就是每个attrname属性值,直接用current()指代即可 -->
    <xsl:variable name="vName" select="DATAPACKET/ROWDATA/*[local-name() = current()]"/>
    <!-- 输出第一个匹配到的元素值 -->
    <xsl:value-of select="$vName[1]"/>
    <!-- 可以加个分隔符方便看结果,比如换行 -->
    <xsl:text>&#10;</xsl:text>
</xsl:for-each>

关键改动说明

  1. 动态匹配元素名:用local-name() = current()替代原来的/$blah。current()会返回当前for-each循环里的attrname值,local-name()用来获取元素的本地名称(如果你的XML有命名空间,就换成name()来匹配带命名空间的完整名称)。
  2. 简化变量:原来的$blah变量其实没必要,直接用current()就能拿到当前循环的attrname值,代码更简洁。
  3. 路径正确性:确保DATAPACKET/ROWDATA/*确实指向你的行数据元素,每个行元素下存在和attrname同名的子元素。

额外提示(如果用XSLT 2.0+)

如果你的环境支持XSLT 2.0或更高版本,还可以用更直观的动态元素选择语法:

<xsl:variable name="vName" select="DATAPACKET/ROWDATA/*[node-name() = current()]"/>

或者直接用变量作为元素名:

<xsl:variable name="fieldName" select="."/>
<xsl:variable name="vName" select="DATAPACKET/ROWDATA/*/$fieldName"/>

不过新手一般先从XSLT 1.0的写法入手更稳妥~

内容的提问来源于stack exchange,提问作者Sakizzle

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 08:05:13