2010-10-02 77 views
1

我想编写一个xslt来将一个xml文件转换为另一个xml文件。源XML文件是类似以下XSLT转换的疑问

<orgs> 
<organization revenue="10000"> 
    <name>foo</name> 
</organization> 
<organization parent="foo"> 
<name>foo2</name> 
</organization> 
<organization parent="foo2"> 
<name>foo3</name> 
</organization> 
</orgs> 

输出XML应该如下

<orgo> 
<organization revenue="10000"> 
<name>foo</name> 
<organization> 
    <name>foo2</name> 
    <organization><name>foo3</name></organization> 
</organization> 
</organization> 
</orgo> 

到目前为止,我试着写了xsl如下 xslt

+0

问得好(+1)。看到我的答案是两种不同的,完整和短的解决方案。 :) – 2010-10-03 00:32:38

回答

1

这种转变

<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()[1]"/> 
     <xsl:apply-templates select="following-sibling::node()[1]"/> 
    </xsl:copy> 
</xsl:template> 

</xsl:stylesheet> 

当所提供的XML文档施加:

<orgs> 
    <organization revenue="10000"> 
     <name>foo</name> 
    </organization> 
    <organization parent="foo"> 
     <name>foo2</name> 
    </organization> 
    <organization parent="foo2"> 
     <name>foo3</name> 
    </organization> 
</orgs> 

产生想要的,正确的输出

<orgs> 
    <organization> 
     <name>foo</name> 
     <organization> 
     <name>foo2</name> 
     <organization> 
      <name>foo3</name> 
     </organization> 
     </organization> 
    </organization> 
</orgs> 

万一<organization>元素的顺序是随机的,如以下XML文档

<orgs> 
    <organization parent="foo2"> 
     <name>foo3</name> 
    </organization> 
    <organization parent="foo"> 
     <name>foo2</name> 
    </organization> 
    <organization revenue="10000"> 
     <name>foo</name> 
    </organization> 
</orgs> 

这种转变产生通缉的结果

<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> 
     <xsl:apply-templates select="organization[not(@parent)]"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="organization"> 
    <xsl:copy> 
     <xsl:copy-of select="node()"/> 
     <xsl:apply-templates select="../organization[@parent=current()/name]"/> 
    </xsl:copy> 
</xsl:template> 
</xsl:stylesheet> 
+0

这太棒了!谢谢! – charudatta 2010-10-03 00:53:32

+0

+1这是一个很好的答案。另外,每当有交叉引用时,密钥都是不错的选择。 – 2010-10-03 18:43:15