删除属性的值与其他元素的属性值匹配的元素

问题描述 投票:0回答:2

假设我有以下输入文件:

<root>
  <container_items>
    <item Id="a" Name="red_dark" />
    <item Id="b" Name="yellow" />
    <item Id="c" Name="blue_dark" />
    <item Id="d" Name="green" />
  </container_items>

  <container_refs>
    <item_ref Id="a" />
    <item_ref Id="b" />
    <item_ref Id="c" />
    <item_ref Id="d" />
  </container_refs>
</root>

真正的文件要复杂得多,但是我将通过简单的条件来简化它,以删除那些具有以“ _dark”结尾的Name属性的文件。我设法删除了不需要的'item'元素,但是剩下了相应的'item_ref'元素。假设我删除了符合我的条件的“ item”元素。我的目标是删除带有Id =“ a”或=“ c”的'item_ref'元素(这些元素是匹配并删除的'item'元素的ID)。因此,预期的最终结果是。

<root>
  <container_items>
    <item Id="b" Name="yellow" />
    <item Id="d" Name="green" />
  </container_items>

  <container_refs>
    <item_ref Id="b" />
    <item_ref Id="d" />
  </container_refs>
</root>

[显然,我需要删除具有Id属性的所有'item_ref'元素,并从某些'item'元素'Id属性(与我对'item'元素的现有标准匹配)的值列表中删除该值。

我的XSL文件如下(仅关注条件):

<xsl:template match="//item[substring(@Name, string-length(@Name)- string-length('_dark') + 1) = '_dark']]" />

根据我的标准,删除了与标准匹配的'item'元素,但随后关联的'item_ref'元素仍保留在输入文件中,从而导致以下结果:

<root>
  <container_items>
    <item Id="b" Name="yellow" />
    <item Id="d" Name="green" />
  </container_items>

  <container_refs>
    <item_ref Id="a" />
    <item_ref Id="b" />
    <item_ref Id="c" />
    <item_ref Id="d" />
  </container_refs>
</root>

我了解我首先需要删除“相应的” item_ref”元素,然后按照当前的标准删除“ item”元素。预先感谢您的支持。

xslt
2个回答
0
投票

key定义为:

<xsl:key name="item" match="item" use="@Id" />
然后使用:

<xsl:template match="item_ref[substring(key('item', @Id)/@Name, string-length(key('item', @Id)/@Name) - string-length('_dark') + 1) = '_dark']"/>

删除item_ref节点。 

[通过将相关的ID存储在变量中,可能是一种更有效的方法,但这是一般的想法。


0
投票
您可以通过xsl:key和两个空模板来实现:

<xsl:key name="items" match="container_items/item" use="@Id" />

和两个空模板是

<xsl:template match="container_items/item[contains(key('items',@Id)/@Name,'_dark')]" /> <xsl:template match="container_refs/item_ref[contains(key('items',@Id)/@Name,'_dark')]" />

[第一个从item中删除container_items,第二个从item_ref中删除container_refs
© www.soinside.com 2019 - 2024. All rights reserved.