迭代删除引用元素

时间:2016-06-23 14:50:07

标签: xml xslt

我是XSLT的新手,并且不知道如何解决我想删除一些引用其他节点的节点的情况,具体取决于代码中引用的元素位置。

这是一个简短的基本示例(语法可能不完全正确)。来源是:

<nodeTypeA id=0>
  <nodeTypeB id="1">lorem ipsum</nodeTypeB>
  <nodeTypeC id="2">
     <nodeTypeD id="3">D1</nodeTypeD>
     <nodeTypeE id="4">D2</nodeTypeE>
     <nodeTypeF id="5">D2</nodeTypeF>
  </nodeTypeC>
  <nodeTypeC id="6">
     <nodeTypeD id="7">D1</nodeTypeD>
     <nodeTypeE id="8">D2</nodeTypeE>
     <nodeTypeF id="9">D2</nodeTypeF>
  </nodeTypeC> 
</nodeTypeA>
<nodeType1 id="a">
  <nodeType2 id="b" ref="5">lorem ipsum</nodeType2>
  <nodeType3 id="c" ref="2">lorem ipsum</nodeType3> 
  <nodeType4 id="d" ref="1">lorem ipsum</nodeType4>
  <nodeType5 id="e" ref="3">lorem ipsum</nodeType5>
  <nodeType6 id="f" ref="4">lorem ipsum</nodeType6> 
  <nodeType2 id="g" ref="6">lorem ipsum</nodeType2>
  <nodeType3 id="h" ref="7">lorem ipsum</nodeType3> 
  <nodeType5 id="i" ref="8">lorem ipsum</nodeType5>
  <nodeType6 id="j" ref="9">lorem ipsum</nodeType6>          
</nodeType1>

我的目标是删除nodeTypeC节点的所有子节点(即具有id 2和6的节点)以及nodeType1下的节点,这些节点引用那些被移除的子节点(即id 3,4,5,7,8,9) )。所以我想删除带有ids e,f,b,h,i,j的节点。生成的部分XML将如下所示:

<nodeTypeA id=0>
  <nodeTypeB id="1">lorem ipsum</nodeTypeB>
  <nodeTypeC id="2"></nodeTypeC>
  <nodeTypeC id="6"></nodeTypeC> 
</nodeTypeA>
<nodeType1 id="a">
  <nodeType3 id="c" ref="2">lorem ipsum</nodeType3> 
  <nodeType4 id="d" ref="1">lorem ipsum</nodeType4>
  <nodeType2 id="g" ref="6">lorem ipsum</nodeType2>        
</nodeType1>

我对XSLT来说是全新的,所以答案对你来说似乎微不足道...... 谢谢你的帮助!

1 个答案:

答案 0 :(得分:0)

定义一个键

<xsl:key name="ref" match="nodeTypeC/*" use="@id"/>

然后编写三个模板,第一个是身份转换

<xsl:template match="@* | node()">
  <xsl:copy>
     <xsl:apply-templates select="@* | node()"/>
  </xsl:copy>
</xsl:template>

第二个删除了nodeTypeC

的子项
<xsl:template match="nodeTypeC/*"/>

和第三个引用元素

<xsl:template match="nodeType1/*[key('ref', @ref)]"/>

您当然可以将最后两个模板合并为一个

<xsl:template match="nodeTypeC/* | nodeType1/*[key('ref', @ref)]"/>