XSLT转换技术问询:复制XML并完成指定节点修改
修正后的XSL代码及问题说明
首先,我先明确你的核心需求:
- 完整复制输入XML的所有内容,但要排除
<CTO/PT/address>节点; - 为每个
<OLS/OL>节点下的<PT/addressId>填充对应数据:通过<OL>的<id>值,匹配<output_getquerydata>里query参数的id,再把对应results中的address值填入。
原XSL的问题点
你提到的获取OL id的变量路径错误,大概率是引用<OL>的<id>时,使用了错误的相对路径或上下文节点,导致无法正确匹配<output_getquerydata>中的对应数据。
修正后的XSL代码
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <!-- 身份模板:默认复制所有节点和属性 --> <xsl:template match="@*|node()"> <xsl:copy> <xsl:apply-templates select="@*|node()"/> </xsl:copy> </xsl:template> <!-- 排除CTO/PT/address节点 --> <xsl:template match="CTO/PT/address"/> <!-- 处理OLS/OL/PT/addressId节点,填充匹配的address值 --> <xsl:template match="OLS/OL/PT/addressId"> <xsl:variable name="current-ol-id" select="../../id"/> <!-- 正确获取当前OL的id --> <!-- 匹配output_getquerydata中对应id的result的address --> <xsl:copy> <xsl:value-of select="/output_getquerydata/query[parameter/@id = $current-ol-id]/results/address"/> </xsl:copy> </xsl:template> </xsl:stylesheet>
关键修正说明
- 身份模板:保留默认的节点复制逻辑,确保除了被特殊模板匹配的节点外,其他所有内容都原样复制。
- 排除指定节点:通过
match="CTO/PT/address"的空模板,直接跳过该节点的复制,实现排除需求。 - 正确获取OL的id:处理
addressId时,用../../id(从addressId往上两级到OL节点,再取id值)获取当前OL的id,这是核心修正点,确保变量能拿到正确的匹配值。 - 匹配对应数据:通过
/output_getquerydata/query[parameter/@id = $current-ol-id]/results/address的XPath,精准定位到对应id的query结果中的address值,填充到addressId节点中。
如果你的输入XML结构有细微差异(比如output_getquerydata的层级不同),可以根据实际结构调整XPath路径,核心逻辑就是先正确获取OL的id,再进行匹配。
内容的提问来源于stack exchange,提问作者user3529643
相关产品推荐
相关产品推荐

