2013-10-03 100 views
0

有人可以解释我如何使用XSLT将Input XML转换为Output XML: 我需要删除XML中没有'Type'元素的值为'Account'的子元素的'RElement'。 'RElement'是递归的。XSLT删除XML中的元素

输入XML的

<RElement> 
<Type>Group</Type> 
<RElement> 
<Type>Group</Type> 
<RElement> 
    <Type>Account</Type> 
</RElement> 
</RElement> 
<RElement> 
<Type>Group</Type> 
<RElement> 
    <Type>Group</Type> 
    <RElement> 
    <Type>Group</Type> 
    </RElement> 
</RElement> 
</RElement> 
</RElement> 

输出XML的

<RElement> 
<Type>Group</Type> 
<RElement> 
<Type>Group</Type> 
<RElement> 
    <Type>Account</Type> 
</RElement> 
</RElement> 
</RElement> 
+1

你尝试过这么远吗?请编辑问题并显示您当前的XSLT。 –

回答

0

你可以试试这个:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml"/> 
    <xsl:template match="@*|node()"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*|node()"/> 
    </xsl:copy> 
    </xsl:template> 
    <xsl:template match="RElement[not(.//Type[text() = 'Account'])]" /> 
</xsl:stylesheet> 

基本上它的身份与RElement元素的空模板没有按”变换t在其后代子元素中具有值为'Account'的'Type'元素。

编辑添加伊恩·罗伯特的空的模板,这是更好的:

<xsl:template match="RElement[not(.//Type = 'Account')]" /> 
+1

或者更简单,'' - 在这种情况下你不需要'text()',因为你关心的是“Type”元素的完整字符串值,而不是其中的单个文本节点。 –