我是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来说是全新的,所以答案对你来说似乎微不足道...... 谢谢你的帮助!
答案 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)]"/>