2010-05-04 118 views
1

我嘗試通過XSLT更改我的XML文件。 該文件是這樣的:通過xslt合併具有相同名稱的節點

<A1> 
<A2> 
<A3> 
<b>a</b> 
<b>b</b> 
... 
</A3> 
</A2> 
</A1> 
<A1> 
<A2> 
<A3> 
<b>1</b> 
<c>2</c> 
</A3> 
</A2> 
</A1> 
... 

結果應該是:

<A1> 
<A2> 
<A3> 
<b>a, b</b> 
</A3> 
</A2> 
</A1> 
<A1> 
<A2> 
<A3> 
<b>1</b> 
<c>2</c> 
</A3> 
</A2> 
</A1> 

任何人可以幫助我與!!!! 問候

+1

那麼,合併背後的邏輯是什麼?請編輯您的問題並描述它。 – 2010-05-04 16:16:27

+0

我改變了問題。我不確定我是否可以描述這一點。應該合併具有相同名稱的節點(合併在exp中),但不是所有節點都只有名稱爲b的節點。問題是:xml文件不具有相同的結構。這意味着有時候b有3個「父母」有時候會有2,4,...有沒有解決方案? – MADAL 2010-05-05 07:15:46

回答

0

這在很大程度上取決於一些你沒有提到的,像往常一樣是孩子元素的順序(即將它永遠是<b><b><c>或可能它是<b><c><b>)的東西,是元素始終的孩子<A3>元素。

對於上述XML我寫了一個模板來處理該元素如下:

<xsl:template match="A3"> 
    <A3> 
    <xsl:for-each select="*"> 
      <xsl:choose> 
        <xsl:when test="following-sibling::*[name()=current()/name()] and not(preceding-sibling::*[name()=current()/name()])"> 
         <xsl:element name="{name()}"> 
         <xsl:for-each select="self::* | following-sibling::*[name()=current()/name()]"> 
           <xsl:value-of select="."/> 
           <xsl:if test="position() != last()">,</xsl:if> 
          </xsl:for-each> 
          </xsl:element> 
         </xsl:when> 
        <xsl:when test="not(following-sibling::*[name()=current()/name()]) and preceding-sibling::*[name()=current()/name()]"> 
         </xsl:when> 
         <xsl:otherwise> 
          <xsl:copy-of select="."/> 
          </xsl:otherwise> 
      </xsl:choose> 
     </xsl:for-each> 
     </A3> 
</xsl:template> 

有可能是這樣做的一個簡單的方法,但這至少是一種方式。它可能會很慢,具體取決於您針對特定節點的子元素數量。

相關問題