首页 > 解决方案 > 删除具有与其他元素的属性值匹配的属性值的元素

问题描述

假设我有以下输入文件:

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

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

真正的文件稍微复杂一些,但我将在此处使用更接近的标准使其看起来更简单,以删除那些具有“Content”子元素且 Name 属性以“_dark”结尾的“item”元素。我设法删除了我不需要的“item”元素,但是留下了相应的“item_ref”元素。假设我删除了符合我的条件的“项目”元素。我的目标是要删除具有 Id="a" 或 ="c" 的 'item_ref' 元素(这些是匹配和删除的 'item' 元素的 Id)。所以预期的最终结果是。

<root>
  <container_items>
    <item Id="b">
      <Content Name="yellow" />
    </item>
    <item Id="d">
      <Content Name="green" />
    </item>
  </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[./Content[substring(@Name, string-length(@Name)- string-length('_dark') + 1) = '_dark']]" />

根据我的标准,匹配标准的“item”元素被删除,但相关的“item_ref”元素仍保留在输入文件中,导致以下结果:

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

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

预先感谢您的支持。

标签: xslt

解决方案


将密钥定义为:

<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 存储在变量中,可能有一种更有效的方法,但这是一般的想法。


推荐阅读