2017-02-27 36 views
1

我有xml如何修改創建的輸出DOM元素?

<Root> 
    <A> 
    <B>X</B> 
    <C>Y</C> 
    <D>Z</D> 
    </A> 
</Root> 

隨着使用xslt變換,我需要這樣的:

<Root> 
    <Wrap type="B"> 
    <A> 
    <B>X</B> 
    </A> 
    </Wrap> 
    <Wrap type="C"> 
    <A> 
    <B>Y</B> 
    </A> 
    </Wrap> 
    <Wrap type="D"> 
    <A> 
    <B>Z</B> 
    </A> 
    </Wrap> 
</Root> 

我應該用什麼樣的xsl::select?以及如何修改xsl中剛剛創建的元素。

編輯:正確的錯字,問題更新。 我在列表中添加另一個元素,現在它是A的列表,應該被分類。

<Root> 
    <A> 
    <B>X</B> 
    <C>Y</C> 
    <D>Z</D> 
    </A> 
    <A> 
    <B>X1</B> 
    <C>Y1</C> 
    <D>Z1</D> 
    </A> 
</Root> 

現在我想

<Root> 
    <Wrap type="B"> 
    <A> 
    <B>X</B> 
    <B>X1</B> 
    </A> 
    </Wrap> 
    <Wrap type="C"> 
    <A> 
    <B>Y</B> 
    <B>Y1</B> 
    </A> 
    </Wrap> 
    <Wrap type="D"> 
    <A> 
    <B>Z</B> 
    <B>Z1</B> 
    </A> 
    </Wrap> 
</Root> 

回答

0

使用此

<xsl:template match="Root"> 
    <xsl:copy> 
    <xsl:for-each select="A[1]/*"> 
     <xsl:variable name="en" select="local-name(current())"/> 
     <Wrap type="{local-name(current())}"> 
      <A> 
       <xsl:for-each select="//A/*[name() eq $en]"> 
       <B> 
        <xsl:value-of select="."/> 
       </B> 
       </xsl:for-each> 
      </A> 
     </Wrap> 
    </xsl:for-each> 
    </xsl:copy> 
</xsl:template> 
+0

THX,我該如何使用它的列表根/ A? (查看問題更新) – Juriy

+0

太棒了!謝謝。 – Juriy

0

更新與分組:

<?xml version="1.0" encoding="ISO-8859-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="Root"> 
    <xsl:copy> 
    <xsl:for-each-group select="A/*" group-by="name()"> 
     <xsl:element name="Wrap"> 
     <xsl:attribute name="name"><xsl:value-of select="current-grouping-key()" /></xsl:attribute> 
     <A> 
      <xsl:for-each select="current-group()"> 
      <B> 
       <xsl:value-of select="." /> 
      </B> 
      </xsl:for-each> 
     </A> 
     </xsl:element> 
    </xsl:for-each-group> 
    </xsl:copy> 
</xsl:template> 


</xsl:stylesheet>