使用XSLT将XML中标识符引用的节点值复制到其他节点的问题求助
问题排查及解决方案
错误原因
- XPath中变量引用错误:你在选择路径里给
$IdObject加了单引号,导致程序将其识别为固定字符串'$IdObject',而非你存储的ID变量值,XPath引用变量无需加引号。 - 节点名大小写不匹配:原XML中的文件名字段为
FileName,你的选择路径写为Filename,XSLT对大小写敏感,无法匹配到对应节点。 - 输出节点名不匹配:你期望输出的标题节点为
<Name>,原代码中仍使用<Title>,需要同步调整。
修正后代码
<xsl:template match="Content"> <!-- 变量可直接用select赋值,简化写法 --> <xsl:variable name="IdObject" select="ObjectReference" /> <Out> <Name> <xsl:value-of select="Title"/> </Name> <FileName> <!-- 去掉变量的单引号,修正节点名大小写 --> <xsl:value-of select="//Object[@id=$IdObject]/FileName"/> </FileName> </Out> </xsl:template>
可选优化
如果处理的XML文件体积较大,全局路径//Object会影响性能,可通过定义key优化查找效率:
<!-- 顶层定义key,放在template外即可 --> <xsl:key name="objectById" match="Object" use="@id" /> <xsl:template match="Content"> <xsl:variable name="IdObject" select="ObjectReference" /> <Out> <Name> <xsl:value-of select="Title"/> </Name> <FileName> <!-- 用key查找,性能更优 --> <xsl:value-of select="key('objectById', $IdObject)/FileName"/> </FileName> </Out> </xsl:template>
内容的提问来源于stack exchange,提问作者Pick
相关产品推荐
相关产品推荐

