2012-06-12 43 views
2

我在XSL新的和需要帮助:(我需要得到子节点作为父母有价票据XSL得到的子节点

<planet> 
    <venus> sometext 
     <mass>123</mass> 
    </venus> 
    <mars>text about mars</mars> 
</planet> 

所以我一定要得到它以这种形式:

<venus>sometext 
    <mass>123</mass> 
</venus> 
<mars> text about mars <mars> 

节点必须迹象“<”中和“>”作为编译认为他们是父母注意的内容。 谢谢!

+0

请注意,它自己的输出不是有效的XML文档。 – Eric

回答

2
<?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" indent="yes"/> 

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

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

这种转化

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 
<xsl:strip-space elements="*"/> 

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

<xsl:template match="planet"> 
    <xsl:apply-templates/> 
</xsl:template> 
</xsl:stylesheet> 

当所提供的XML文档应用:

<planet> 
    <venus> sometext 
     <mass>123</mass> 
    </venus> 
    <mars>text about mars</mars> 
</planet> 

产生想要的,正确的结果:

<venus> sometext 
     <mass>123</mass> 
</venus> 
<mars>text about mars</mars> 

的第二溶液 - 更直接短

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 
<xsl:strip-space elements="*"/> 

<xsl:template match="/*"> 
    <xsl:copy-of select="node()"/> 
</xsl:template> 
</xsl:stylesheet> 

说明

在两种方案中,我们避免了元素树的根的复制,并复制其子树。

在第一解决方案的子树的复制是的identity rule的效果 - 这给了我们更多的灵活性,如果在未来改变我们的计划,并决定不是单纯的节点复制子树,但改造的他们中的一些或全部。

在第二种解决方案中,使用单个XSLT指令完成复制 - <xsl:copy-of>。我们在这里交易灵活性,以提高速度和紧凑性