2011-10-26 54 views
0

我在論壇中使用了一些代碼來包裝一個節點內的一些子節點,但現在我正在努力將標題放入根節點。這是我要轉換的XML的例子:在匹配較低節點後將元素放入根節點

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<A> 
    <B> 
     <C>stuff</C> 
     <D>stuff1</D> 
     <E>stuff2</E> 
    </B> 
    <B> 
     <C>stuff3</C> 
     <D>stuff4</D> 
     <E>stuff5</E> 
    </B> 
</A> 

,這就是我需要:

<?xml version="1.0"?> 
<A> 
    <H>heading</H> 
    <B> 
     <C>stuff</C> 
     <ExtraInfo> 
      <D>stuff</D> 
      <E>stuff2</E> 
     </ExtraInfo> 
    </B> 
    <B> 
     <C>stuff3</C> 
     <ExtraInfo> 
      <D>stuff4</D> 
      <E>stuff5</E> 
     <ExtraInfo> 
    </B> 
</A> 

這是我使用xsl:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:ex="http://exslt.org/dates-and-times" extension-element-prefixes="ex"> 
    <xsl:template match="node()|@*" name="identity"> 
     <xsl:copy> 
      <xsl:apply-templates select="node()|@*"/> 
     </xsl:copy> 
     </xsl:template> 

     <xsl:template match="B/*"/> 
     <xsl:template match="B/C"> 
      <xsl:call-template name="identity"/> 
     </xsl:template> 
     <xsl:template match="B/*[not(self::C)][1]"> 

      <ExtraInfo> 
       <xsl:apply-templates select="D/*" 
            mode="ExtraInfo"/> 
            <D><xsl:value-of select="//D"/></D> 
       <xsl:apply-templates select="E/*" 
            mode="ExtraInfo"/> 
            <E><xsl:value-of select="//E"/></E> 

      </ExtraInfo> 
     </xsl:template> 
     <xsl:template match="B/*" mode="ExtraInfo"> 
      <xsl:call-template name="identity"/> 
     </xsl:template> 


</xsl:stylesheet> 

,這是結果爲:

<?xml version="1.0" ?> 
- <A> 
- <B> 
    <C>stuff</C> 
- <ExtraInfo> 
    <D>stuff1</D> 
    <E>stuff2</E> 
    </ExtraInfo> 
    </B> 
- <B> 
    <C>stuff3</C> 
- <ExtraInfo> 
    <D>stuff1</D> 
    <E>stuff2</E> 
    </ExtraInfo> 
    </B> 
    </A> 

如果我嘗試爲根節點放置一個模板,我得到一個錯誤告訴我,我不能有2個更高級別的元素,或者一些這樣的元素。我怎樣才能插入標題?

回答

0

A元素添加模板,即

<xsl:template match="A"> 
    <xsl:copy> 
    <H>Heading</H> 
    <xsl:apply-templates/> 
    </xsl:copy> 
</xsl:template> 
+0

你好,非常感謝,這工作,但我只注意到節點下 stuff3我應該得到「stuff4」和「stuff5」不「stuff1」和「stuff2」。我想知道你看到了什麼問題嗎? – Geoff

+0

那麼''是錯誤的,您寧願要使用'' 。 ''也是如此。另一方面,該模板中的整個代碼看起來有點複雜,我寧願寫一個匹配'B'的模板,然後將模板應用於'C',輸出包裝元素'ExtraInfo'並通過將模板應用於'D'和'E':''。 –

+0

我知道。我只是對這個東西感到陌生,並且感覺我的方式。有什麼好的教程你會推薦? w3c有點基本,規則沒有解釋得很好。我想我將不得不投資一本好書。 – Geoff