2013-05-09 1 views
0

J'ai le document XML ci-dessous que je souhaite transformer en utilisant XSLT.XSLT: Envelopper un noeud et le noeud de texte suivant avec une autre balise

Entrée:

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

Je dois écrire une transformation afin que chaque titre et il texte suivant est enveloppé dans une balise <sec> comme dans l'exemple ci-dessous montre.

sortie souhaitée:

<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> 

Est-ce que quelqu'un sait comment je pourrais le faire en utilisant une feuille de style XSLT?

Merci

Répondre

1

S'il vous plaît trouver XSLT ci-dessous:

<?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

Cela correspond à la question, mais ne fonctionnera que s'il n'y a que B nœuds et nœuds de texte en tant qu'enfants d'ABAS –

0

Ceci est votre solution:

<?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

Essayez ceci:

<?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> 

qui va générer la sortie suivante :

<?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> 
Questions connexes