XSLT 1.0动态节点集变量无法访问字段问题求助
XSLT 1.0中xsl:choose动态选节点存变量的问题解答
首先明确:用xsl:choose动态选择节点存入变量的方式完全可行,你的问题大概率出在节点访问的细节上,以下是常见问题和解决方法:
可能的错误原因及修复方案
1. 命名空间不匹配
如果原文档中的UniqueId元素属于某个命名空间,转换后的节点集依然保留该命名空间,直接用/UniqueId会找不到节点。
修复:在XSLT样式表中绑定对应命名空间前缀,访问时带上前缀。例如:
<!-- 样式表头部声明命名空间 --> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" xmlns:msxsl="urn:schemas-microsoft-com:xslt" xmlns:doc="http://your-document-namespace"> <!-- 访问时使用前缀 --> <xsl:value-of select="msxsl:node-set($SO)/doc:UniqueId"/>
2. 节点路径层级错误
你可能忽略了$SO中节点的嵌套结构,比如$SO存储的是父节点(如<Order>),而UniqueId是其子节点,直接写/UniqueId路径不对。
修复:调整路径层级,匹配实际节点结构。例如:
<!-- 假设$SO中存储的是<Order>节点,UniqueId是它的子节点 --> <xsl:value-of select="string(msxsl:node-set($SO)/Order/UniqueId)"/>
3. string()函数的使用局限
XSLT 1.0中string()作用于节点集时,只会返回第一个节点的字符串值。如果$SO包含多个节点,且第一个节点没有UniqueId,就会返回空值。
修复:如果要获取所有节点的UniqueId,需要遍历节点集:
<xsl:for-each select="msxsl:node-set($SO)/Order"> <xsl:value-of select="UniqueId"/> </xsl:for-each>
4. 变量$SO的定义错误
如果变量$SO没有正确复制节点,而是生成了新的无结构文本或节点,也会导致无法访问UniqueId。要确保用<xsl:copy-of>复制原节点。
正确的变量定义示例:
<xsl:variable name="SO"> <xsl:choose> <xsl:when test="some-condition"> <!-- 复制原文档中的目标节点 --> <xsl:copy-of select="//Order[Status='Active']"/> </xsl:when> <xsl:otherwise> <xsl:copy-of select="//Order[Status='Inactive']"/> </xsl:otherwise> </xsl:choose> </xsl:variable>
排查建议
可以先输出msxsl:node-set($SO)的完整内容,确认变量中确实包含带有UniqueId的节点:
<xsl:copy-of select="msxsl:node-set($SO)"/>
通过查看输出的节点结构,就能快速定位路径或命名空间的问题。
内容的提问来源于stack exchange,提问作者Jonny Hotchkiss
相关产品推荐
相关产品推荐

