2016-03-09 41 views
0

我想在新父項下嵌套某些元素,但僅限於某些id值。一旦他們嵌套,他們不能再重複。如何在新父項下移動多個元素,但只能移動一次?

來源:

<root name="root 1"> 
    <elem id="java" value="val1"/> 
    <elem id="python" value="val2"/> 
    <elem id="chair" value="val3"/> 
</root> 

通緝的結果:

<root name="root 1"> 
    <container name="lang"> 
    <elem id="java" value="val1"/> 
    <elem id="python" value="val2"/> 
    </container> 
    <elem id="chair" value="val3"/> 
</root> 

附加美中不足的是:有,不是築巢所有目標將可用的可能性。儘管如此,它們應該以空值嵌套。

來源:

<root name="root 1"> 
    <elem id="java" value="val1"/> 
    <elem id="chair" value="val3"/> 
</root> 

目標:

<root name="root 1"> 
    <container name="lang"> 
    <elem id="java" value="val1"/> 
    <elem id="python" value=""/> 
    </container> 
    <elem id="chair" value="val3"/> 
</root> 

我的成績不斷重複的container。我如何按預期轉換它?

+0

你可以發佈模板,*正在重複'容器'*? – har07

+0

XSLT 1.0或2.0? – har07

+0

版本2.0 ... – Saran

回答

0

您可以遍歷XSLT 2.0中的字符串列表。所以這可能做的工作:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"> 

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


    <xsl:template match="root"> 
    <xsl:copy> 
     <xsl:copy-of select="@*"/> 
     <xsl:variable name="elems" select="elem"/> 
     <container> 
     <xsl:for-each select="('java', 'python')"> 
      <elem id="{.}" value="{string($elems[@id=current()]/@value)}"/> 
     </xsl:for-each> 
     </container> 

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

    <xsl:template match="elem[@id=('java', 'python')]"/> 
</xsl:stylesheet> 
+0

它完成這項工作。謝謝 :) – Saran