XSLT 1.0递归模板转换中HandlingUnitItem重复问题及疑问
XML转换中HandlingUnitItem重复问题排查及exslt:node-set($Contents)说明
一、HandlingUnitItem节点重复问题排查
针对路径/HandlingUnit/HandlingUnitItem/HandlingUnit/HandlingUnitItem下的节点在输出XML中重复的问题,可从以下方向排查:
- XSLT递归匹配逻辑:检查是否存在模板匹配
HandlingUnitItem时未限制层级,比如模板规则未区分顶层和嵌套的HandlingUnitItem,导致嵌套节点被多次遍历处理。 - 节点集重复引用:查看XSLT中是否对该路径节点有重复的选择或复制操作,比如在变量或循环中多次引用同一节点集合且未做去重处理。
- 输入XML原始结构:确认输入XML中该路径下的
HandlingUnitItem是否本身存在重复,若输入已重复,转换后会直接保留该结构。
二、exslt:node-set($Contents)中$Contents变量说明
$Contents是XSLT中自定义的临时变量,存储的是结果树片段(RTF)——通常是通过节点选择、模板应用或节点复制生成的临时节点集合。- 在XSLT 1.0规范中,结果树片段无法直接用XPath查询和遍历,必须通过
exslt:node-set()函数将其转换为标准节点集,才能对其中的节点进行后续处理。 - 要明确
$Contents的具体内容,需查看XSLT中该变量的定义代码:- 若定义为
<xsl:variable name="Contents" select="XPath表达式"/>,则$Contents存储的是该XPath匹配到的所有节点。 - 若定义为
<xsl:variable name="Contents"><xsl:copy-of select="节点路径"/><xsl:apply-templates select="节点路径"/></xsl:variable>,则$Contents存储的是指定节点的副本或模板处理后的结果树。
- 若定义为
示例参考
假设XSLT中存在如下代码,若模板HandlingUnitItem又处理了子节点中的同类型节点,就会引发重复输出:
<xsl:variable name="Contents"> <xsl:apply-templates select="/HandlingUnit/HandlingUnitItem/HandlingUnit/HandlingUnitItem"/> </xsl:variable> <xsl:for-each select="exslt:node-set($Contents)/HandlingUnitItem"> <xsl:copy-of select="."/> </xsl:for-each> <xsl:template match="HandlingUnitItem"> <xsl:copy-of select="."/> <!-- 若此处递归处理子节点中的HandlingUnitItem,会导致重复 --> <xsl:apply-templates select="HandlingUnit/HandlingUnitItem"/> </xsl:template>
内容的提问来源于stack exchange,提问作者Hari
相关产品推荐
相关产品推荐

