2013-05-09 84 views
0

我已經得到了我想用XSLT轉換的下面的XML文檔。XSLT:用另一個標籤包裝節點和跟隨文本節點

輸入:

<ABS> 
    <B>Heading 1</B> 
    text 
    <B>Heading 2</B> 
    text 
    <B>Heading 3</B> 
    text 
    <B>Heading 4</B> 
    text 
</ABS> 

我需要讓每一個標題和它下面的文本被包裹在一個<sec>標籤像下面的例子說明了編寫一個轉變。

所需的輸出:

<ABS> 
    <sec> 
    <B>Heading 1</B> 
    text 
    </sec> 
    <sec> 
    <B>Heading 2</B> 
    text 
    </sec> 
    <sec> 
    <B>Heading 3</B> 
    text 
    </sec> 
    <sec> 
    <B>Heading 4</B> 
    text 
    </sec>  
</ABS> 

有誰知道我能做到這一點使用XSLT樣式表?

感謝

回答

1

請看以下XSLT:

<?xml version='1.0'?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:template match="ABS"> 
<xsl:copy> 
    <xsl:for-each select="B"> 
    <sec><xsl:copy-of select="."/><xsl:value-of select="following-sibling::text()[1]"/></sec> 
    </xsl:for-each> 
</xsl:copy> 
</xsl:template>  
</xsl:stylesheet> 
+0

這符合這個問題,但只適用於只有B節點和文本節點作爲ABAS的子節點 – 2013-05-09 13:51:24

0

這是您的解決方案:

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

    <xsl:output indent="yes"/> 
    <xsl:template match="ABS"> 
    <ABS> 
     <xsl:apply-templates/> 
    </ABS> 
    </xsl:template> 

    <xsl:template match="*"> 
    <xsl:choose> 
     <xsl:when test="name()='B'"> 
     <sec> 
      <xsl:copy-of select="."/> 
      <xsl:value-of select="following-sibling::text()[1]"/> 
     </sec> 
     </xsl:when> 
     <xsl:otherwise> 
     <xsl:copy> 
      <xsl:copy-of select="."/> 
     </xsl:copy> 
     </xsl:otherwise> 
    </xsl:choose> 
    </xsl:template> 

    <xsl:template match="text()"/> 
</xsl:stylesheet> 
0

試試這個:

<?xml version="1.0"?> 
<xsl:stylesheet 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    version="1.0"> 
    <xsl:output method="xml" indent="yes"/> 

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

    <xsl:template match="B"> 
     <sec> 
      <xsl:copy> 
       <xsl:apply-templates /> 
      </xsl:copy> 
      <xsl:value-of select="following-sibling::text()[1]"/> 

     </sec> 
    </xsl:template> 
    <xsl:template match="text()[preceding::*[name()='B']]"> 

    </xsl:template> 
</xsl:stylesheet> 

這將產生以下輸出:

<?xml version="1.0"?> 
<ABS> 
    <sec><B>Heading 1</B> 
    text 
    </sec><sec><B/> 
    text 
    </sec><sec><B/> 
    text 
    </sec><sec><B/> 
    text 
</sec></ABS> 
相關問題