XSLT将父节点ID传递到子节点时多ID模板冲突如何解决?
XSLT多ID下推冲突调整方案
- 限定模板匹配范围,禁止全局通用下推规则
拆分不同ID的下推逻辑,给每个模板加上父节点限定,仅在指定父节点的子节点范围内执行对应ID的下推操作:- 针对
AccountId下推:仅匹配Balance节点的子节点,模板规则写为match="Balance/*",逻辑仅包含复制父节点AccountId到子节点的操作 - 针对交易ID(父节点
Id字段)下推:仅匹配Movement节点的子节点,模板规则写为match="Movement/*",逻辑仅包含复制父节点Id到子节点的操作
- 针对
- 设置模板优先级避免匹配冲突
如果需要保留部分通用下推规则,给针对性更强的父节点限定模板加上priority属性,数值更高的模板会优先执行,示例代码如下:<!-- Movement子节点下推交易ID 优先级设为10 --> <xsl:template match="Movement/*" priority="10"> <xsl:copy> <!-- 重命名避免字段重名覆盖 --> <ParentTransactionId> <xsl:value-of select="../Id"/> </ParentTransactionId> <xsl:apply-templates select="@* | node()"/> </xsl:copy> </xsl:template> <!-- Balance子节点下推AccountId 优先级设为10 --> <xsl:template match="Balance/*" priority="10"> <xsl:copy> <ParentAccountId> <xsl:value-of select="../AccountId"/> </ParentAccountId> <xsl:apply-templates select="@* | node()"/> </xsl:copy> </xsl:template> <!-- 通用复制模板 优先级设为1 作为兜底 --> <xsl:template match="@* | node()" priority="1"> <xsl:copy> <xsl:apply-templates select="@* | node()"/> </xsl:copy> </xsl:template> - 下推ID时重命名字段
不要直接使用Id、AccountId作为子节点的继承字段名,加上Parent前缀区分,彻底避免子节点原生同名字段被覆盖的问题。
以上调整完成后,Balance节点下的Investment仍会正常继承AccountId,Movement节点下的Link节点只会继承父节点的交易ID,不会被错误植入AccountId。
内容的提问来源于stack exchange,提问作者RyanL
相关产品推荐
相关产品推荐

