如何在我的XML转换场景中让XSLT的key函数正常工作
问题根源
- 上下文路径错误:匹配
Results/Result的模板内部,上下文节点是<Result>,直接写Results会从当前<Result>的子节点查找对应节点,无法匹配到文档中顶级的Results节点。 - 筛选逻辑未限定当前ID:你原有for-each的筛选条件仅判断
Results的RefId是否存在对应的Result,两个测试用的RefId都满足条件,所以每次模板执行都会返回两个Results节点,导致输出重复的OBX。
解决方法
推荐调整key的定义逻辑,以RefId为键索引存文本的Results节点,查询更高效:
<!-- 重新定义key,匹配带RefId的Results节点,用RefId作为索引键 --> <xsl:key name="refTextMap" match="Results[RefId]" use="RefId"/> <xsl:template match="Results/Result"> <OBR></OBR> <!-- 直接用当前Result的Id查询对应Text --> <OBX><xsl:value-of select="key('refTextMap', Id)/Text" /></OBX> </xsl:template>
如果需要保留你原有的key定义,也可以修正for-each的筛选条件:
<xsl:key name="test" match="Results/Result" use="Id"/> <xsl:template match="Results/Result"> <OBR></OBR> <!-- 存储当前Result的Id用于筛选 --> <xsl:variable name="currId" select="Id" /> <!-- 从文档根节点查找RefId与当前Id匹配的Results节点 --> <xsl:for-each select="/Results[RefId = $currId]"> <OBX><xsl:value-of select="Text" /></OBX> </xsl:for-each> </xsl:template>
两种方案都可以得到你预期的输出结果。
内容的提问来源于stack exchange,提问作者navi
相关产品推荐
相关产品推荐

