2012-05-15 43 views
3

我正在使用此輸入xml文件。如何在只有一個父標籤的情況下獲得每個父標籤發生的所有子標籤的轉換xml文件

    <Content> 
       <body><text>xxx</text></body> 
        <body><text>yy</text></body> 
       <body><text>zz</text></body> 
       <body><text>kk</text></body> 
        <body><text>mmm</text></body> 
         </Content> 

XSLT轉換後的輸出應該是

     <Content> 
       <body><text>xxx</text> 
         <text>yy</text> 
          <text>zz</text> 
        <text>kk</text> 
        <text>mmm</text></body> 
        </Content> 

誰能請提供其初步認識XSL文件。

+0

Xsl代碼應該是這樣的,對於父標籤'body'的所有遍歷,我只需要獲得一個'body'標籤來創建。 xsl的一部分就像我試過的那樣。 但這裏只創建了文本標籤。並且我不想標籤被硬編碼,如上面的標籤。應該創建它,以便對於整個身體標記遍歷,只需要創建一個標記。 –

回答

2

這完全轉變

<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="node()|@*"> 
    <xsl:copy> 
     <xsl:apply-templates select="node()|@*"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="body"/> 
<xsl:template match="body[1]"> 
    <body> 
    <xsl:apply-templates select="../body/node()"/> 
    </body> 
</xsl:template> 
</xsl:stylesheet> 

時所提供的XML文檔應用:

<Content> 
    <body> 
     <text>xxx</text> 
    </body> 
    <body> 
     <text>yy</text> 
    </body> 
    <body> 
     <text>zz</text> 
    </body> 
    <body> 
     <text>kk</text> 
    </body> 
    <body> 
     <text>mmm</text> 
    </body> 
</Content> 

產生想要的,正確的結果

<Content> 
    <body> 
     <text>xxx</text> 
     <text>yy</text> 
     <text>zz</text> 
     <text>kk</text> 
     <text>mmm</text> 
    </body> 
</Content> 

說明

  1. identity rule副本的每個節點 「原樣」。

  2. 它被兩個模板覆蓋。第一個忽略/刪除每個body元素。

  3. 第二模板重寫身份模板還覆蓋所述第一模板等(即刪除每body元件),用於任何body元件是所述第一子body其父的。對於第一個body子元素,將生成一個body元素,並在其主體中處理其父元素的任何body子元素(當前body元素及其所有body兄弟元素)的子節點的所有節點。

+0

根據我的理解(糾正我,如果我錯了)。第三個模板將匹配第一個身體標記,然後在模板內,而不是處理自己的文本標記,它會去到身體的父標記,即內容(如'。 ./'表示相同)處理所有主體標籤的所有文本標籤(如'../ body/node()')並複製相同。 –

+0

我的問題是'當我們只處理它的父親的第一個身體孩子,爲什麼需要第二個模板刪除每個身體的孩子'。我嘗試刪除第二個模板,只包含身份和第三個模板,但沒有得到所需的輸出你能解釋一下這個背後的原因嗎? –

+0

瞭解apply-templates將在其所有同級中應用模板,如果它的任何人在其「匹配」屬性中給出的。謝謝。 –

1
<xsl:template match="Content"> 
     <body> 
      <xsl:apply-templates select="body/text"/> 
     </body> 
    </xsl:template> 

    <xsl:template match="body/text"> 
    <xsl:copy> 
     <xsl:apply-templates select="@* | node()"/> 
    </xsl:copy> 
    </xsl:template> 
相關問題