我难住了。给定一个 xml 文档,例如:
<Frag>
<DirRef Id="BeemzDir">
<Com Id="BEED24F05AB78FB588F61D4092654B6D" Guid="{A11AB356-2F45-4157-92EF-ED49F5BE0F70}">
<FileName Id="fil1" KeyPath="yes" Source="My.Exe" />
</Com>
<Com Id="FFF24F05AB78FB588F61D4092654CCC" Guid="{A11AB356-2F45-4157-92EF-ED49F5BE0F70}">
<FileName Id="fil2" KeyPath="yes" Source="My.Dll" />
</Com>
</DirRef>
</Frag>
<Frag>
<ComGroup Id="MyGroup">
<CompRef Id="BEED24F05AB78FB588F61D4092654B6D" />
<CompRef Id="FFF24F05AB78FB588F61D4092654CCC" />
</ComGroup>
</Frag>
我需要使用 xslt 来删除包含 Source="My.Exe" 的元素。在这种情况下,删除其属性 id=BEED24F05AB78FB588F61D4092654B6D 的元素“Com”。
我已经做到了。但我不能做的是删除Id = BEED24F05AB78FB588F61D4092654B6D的“CompRef”元素。
因此,转换后我希望我的 xml 看起来像:
<Frag>
<DirRef Id="BeemzDir">
<Com Id="FFF24F05AB78FB588F61D4092654CCC" Guid="{A11AB356-2F45-4157-92EF-ED49F5BE0F70}">
<FileName Id="fil2" KeyPath="yes" Source="My.Dll" />
</Com>
</DirRef>
</Frag>
<Frag>
<ComGroup Id="MyGroup">
<CompRef Id="FFF24F05AB78FB588F61D4092654CCC" />
</ComGroup>
</Frag>
任何帮助,将不胜感激。
更新
这是一些删除“FileName”元素的xml。
<xsl:template match="Com/FileName[contains(@Source,'My.Exe')='true']">
</xsl:template>
所以结果是:
<Frag>
<DirRef Id="BeemzDir">
<Com Id="BEED24F05AB78FB588F61D4092654B6D" Guid="{A11AB356-2F45-4157-92EF-ED49F5BE0F70}">
</Com>
<Com Id="FFF24F05AB78FB588F61D4092654CCC" Guid="{A11AB356-2F45-4157-92EF-ED49F5BE0F70}">
<FileName Id="fil2" KeyPath="yes" Source="My.Dll" />
</Com>
</DirRef>
</Frag>
<Frag>
<ComGroup Id="MyGroup">
<CompRef Id="BEED24F05AB78FB588F61D4092654B6D" />
<CompRef Id="FFF24F05AB78FB588F61D4092654CCC" />
</ComGroup>
</Frag>
更改调用 xsl:apply-template 的上述 xsl 没有任何作用,因为它卡在其运行的节点中。我不知道如何存储要删除的 Id,然后循环遍历它们。
更新 2
可以删除多个节点,即 source="MyExe" 的多个“Com”元素。此外,ID 是自动生成的,因此每次运行都会有所不同。