2012-06-01 71 views
1

如果只有1個孩子,我需要刪除xmi節點。如果我刪除xmi節點,我需要將屬性複製到新的根節點。如果只有1個孩子,需要刪除xmi節點

<xmi:XMI attribute="2" xmlns:xmi="http://www.omg.org/spec/XMI/20110701" xmlns:a="A"> 
<namespace:node attribute2="att"> 
... 
</namespace:node> 
</xmi:XMI> 

我需要得到

<namespace:node attribute2="att" attribute="2" xmlns:xmi="http://www.omg.org/spec/XMI/20110701" xmlns:a="A"> 
... 
</namespace:node> 

但如果有

<xmi:XMI attribute="2" xmlns:xmi="http://www.omg.org/spec/XMI/20110701" xmlns:a="A"> 
<namespace:node attribute2="att"> 
... 
</namespace:node> 
<otherNode/> 
</xmi:XMI> 

沒有變化必須做到的。

任何幫助表示讚賞。

+0

wh在xslt你有至今嗎? –

回答

1

這XSLT 1.0轉化

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:xmi="http://www.omg.org/spec/XMI/20110701"> 
<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="xmi:XMI[not(*[2])]"> 
    <xsl:apply-templates/> 
</xsl:template> 

<xsl:template match="xmi:XMI[not(*[2])]/*"> 
    <xsl:copy> 
     <xsl:apply-templates select="node()|@* | ../@*"/> 
    </xsl:copy> 
</xsl:template> 
</xsl:stylesheet> 

當在下面的XML文檔施加:

<xmi:XMI attribute="2" 
      xmlns:xmi="http://www.omg.org/spec/XMI/20110701" 
      xmlns:a="A" > 
     <namespace:node attribute2="att" xmlns:namespace="some:namespace"> 
      ... 
     </namespace:node> 
     <otherNode/> 
</xmi:XMI> 

產生想要的,正確的結果(無變化):

<xmi:XMI xmlns:xmi="http://www.omg.org/spec/XMI/20110701" xmlns:a="A" attribute="2"> 
    <namespace:node xmlns:namespace="some:namespace" attribute2="att"> 
      ... 
     </namespace:node> 
    <otherNode/> 
</xmi:XMI> 

當該XML文檔上施加:

<xmi:XMI attribute="2" 
      xmlns:xmi="http://www.omg.org/spec/XMI/20110701" 
      xmlns:a="A" > 
     <namespace:node attribute2="att" xmlns:namespace="some:namespace"> 
      ... 
     </namespace:node> 
</xmi:XMI> 

再次有用,正確的結果產生(所述xmi:XMI元件被刪除並且其屬性被複制到其唯一的孩子中):

<namespace:node xmlns:namespace="some:namespace"  
xmlns:xmi="http://www.omg.org/spec/XMI/20110701" xmlns:a="A" 
attribute="2" attribute2="att"> 
      ... 
</namespace:node> 
0

嘗試

<xsl:stylesheet 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    version="2.0" 
    xmlns:xmi="http://www.omg.org/spec/XMI/20110701"> 


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

<xsl:template match="xmi:XMI[not(*[2])"> 
    <xsl:apply-templates/> 
</xsl:template> 

<xsl:template match="xmi:XMI[not(*[2])]/*"> 
    <xsl:copy> 
    <xsl:apply-templates select="../@*, @*, node()"/> 
    </xsl:copy> 
</xsl:template> 

</xsl:stylesheet> 
相關問題