如何在XSLT 1.0中通过匹配XPathNodeIterator与XML设置变量值
在XSLT 1.0中正确匹配节点集与XML树获取MaterialGroup的解决方案
核心思路
XSLT 1.0中没有原生"字符串数组"概念,你提到的XPathNodeIterator对应XSLT的节点集。要实现节点集中的item值与另一XML树的ItemDescription匹配并获取对应Group,可以通过xsl:key建立索引快速匹配,同时规避常见的匹配错误。
常见错误原因
你的代码返回空字符串,大概率是以下问题导致:
- 节点集的路径引用错误,未正确定位到item节点
- 字符串匹配时存在空白字符或大小写不一致
- 未正确加载或引用另一棵XML树的节点
- 变量赋值逻辑未找到第一个匹配项就终止
解决方案代码示例
假设你的节点集结构为<items><item>item1</item><item>item2</item><item>item3</item><item>item4</item></items>,另一棵XML树(比如material-data.xml)结构如下:
<MaterialData> <Material> <ItemDescription>item1</ItemDescription> <Group>GroupA</Group> </Material> <Material> <ItemDescription>item3</ItemDescription> <Group>GroupB</Group> </Material> </MaterialData>
对应的XSLT代码实现:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <!-- 定义key,建立ItemDescription与Group的索引(处理外部XML时需用document()加载) --> <xsl:key name="material-group" match="document('material-data.xml')/MaterialData/Material" use="normalize-space(ItemDescription)"/> <xsl:template match="/"> <!-- 假设$itemList是传入的节点集参数 --> <xsl:param name="itemList"/> <!-- 1. 找到节点集中第一个能匹配到Material的item(去除空白避免匹配失败) --> <xsl:variable name="matching-item" select="$itemList/item[normalize-space(.)][key('material-group', normalize-space(.))][1]"/> <!-- 2. 赋值MaterialGroup变量 --> <xsl:variable name="MaterialGroup" select="key('material-group', normalize-space($matching-item))/Group"/> <!-- 测试输出,实际使用时可直接调用$MaterialGroup变量 --> <Result> <MatchedGroup><xsl:value-of select="$MaterialGroup"/></MatchedGroup> </Result> </xsl:template> </xsl:stylesheet>
关键优化点
- 使用
xsl:key提升匹配效率:避免循环遍历所有Material节点,尤其在数据量较大时更明显 normalize-space()处理空白:去除字符串首尾空白和中间多余空格,避免因格式问题导致匹配失败- 优先取第一个匹配项:通过
[1]限定只取第一个匹配的item,符合常规业务逻辑
排查步骤
如果仍返回空值,可按以下步骤排查:
- 验证节点集路径:确认
$itemList的结构,若item是顶层节点,将$itemList/item改为$itemList - 检查大小写:若存在大小写不匹配,用
translate(., 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz')统一转为小写后匹配 - 确认外部XML加载:若Material数据在主XML内部,去掉
document('material-data.xml'),直接写主XML内的节点路径 - 输出调试信息:临时输出
$matching-item的值,确认是否有匹配到的item
内容的提问来源于stack exchange,提问作者Sumant Kumar Mandal
相关产品推荐
相关产品推荐

