使用xsltproc清理输入XML。
考虑一个引用文档中随机位置的零件描述的零件号。我的XML输入设计得很糟糕,它到处都是对零件描述的零件号引用,而它们的位置没有真正的模式。有些引用是元素中的文本,有些引用是属性中的文本。有时,属性会根据上下文改变含义。包含零件号的属性没有一致的名称,使用的名称会根据其他属性的值而更改。也许我可以在包含零件号的十几个不同位置中选择一个键,但这会一团糟。我也会担心不经意间选择了具有复杂图案的错误项目。
因此,我的目标是只将引用的零件描述复制到输出文档中一次(并非所有描述都被引用(。我可以在所有不同的模板中插入测试,以检测上下文中的零件号。非常简单的解决方案是只测试它是否已经复制到结果树中,而不是再次复制。但没有办法追踪这件事吗?
计划B是将其多次复制到结果树中,然后对输出文档进行第二次遍历以删除重复项。
在问题中使用时态语言("已经是(是一个很好的线索,表明你的想法是错误的。在声明性语言中,你不应该按照处理的顺序来思考。
你可能在寻找这样的东西:
<xsl:variable name="first-of-a-kind-part-references" as="node()*">
<xsl:for-each-group select="f:all-part-references(/)"
group-by="f:get-referenced-part(.)/@id">
<xsl:sequence select="current-group()[1]"/>
</xsl:for-each-group>
</xsl:variable>
然后在处理零件参考时
<xsl:if test=". intersect $first-of-a-kind-part-references">
...
</xsl:if>