2011-04-22 4 views
2

Je travaille dans une base de données qui ne supporte pas vraiment les sous-éléments. Pour contourner cela, nous avons utilisé des parenthèses ondulées }} dans une chaîne de valeurs pour indiquer les séparations entre les sous-éléments. Lorsque nous exportons vers xml, il ressemble à ceci:XSLT: Comment séparer les valeurs supprimées en éléments uniques

<geographicSubject> 
    <data>Mexico }} tgn }} 123456</data> 
    <data>Mexico City }} tgn }} 7891011</data> 
    <data>Main Street }} tgn }} 654321</data> 
</geographicSubject> 

Ma question: comment puis-je créer notre XSLT afin qu'il divise les cordes en <data> en sous-éléments séparés nom unique comme celui-ci:

<data> 
    <location>Mexico</location> 
    <source>tgn</source> 
    <id>123456</id> 
</data> 

Le premier }} indique le début de "source", le second }} indique le début de "id". Merci à tous ceux qui veulent aider!

Répondre

4

rédigez un tokenizer:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:e="http://localhost"> 
    <e:e>location</e:e> 
    <e:e>source</e:e> 
    <e:e>id</e:e> 
    <xsl:variable name="vElement" select="document('')/*/e:*"/> 
    <xsl:template match="node()|@*"> 
     <xsl:copy> 
      <xsl:apply-templates select="node()|@*"/> 
     </xsl:copy> 
    </xsl:template> 
    <xsl:template match="data/text()" name="tokenizer"> 
     <xsl:param name="pString" select="string()"/> 
     <xsl:param name="pPosition" select="1"/> 
     <xsl:if test="$pString"> 
      <xsl:element name="{$vElement[$pPosition]}"> 
       <xsl:value-of 
       select="normalize-space(
          substring-before(concat($pString,'}}'),'}}') 
         )"/> 
      </xsl:element> 
      <xsl:call-template name="tokenizer"> 
       <xsl:with-param name="pString" 
           select="substring-after($pString,'}}')"/> 
       <xsl:with-param name="pPosition" select="$pPosition + 1"/> 
      </xsl:call-template> 
     </xsl:if> 
    </xsl:template> 
</xsl:stylesheet> 

Sortie:

<geographicSubject> 
    <data> 
     <location>Mexico</location> 
     <source>tgn</source> 
     <id>123456</id> 
    </data> 
    <data> 
     <location>Mexico City</location> 
     <source>tgn</source> 
     <id>7891011</id> 
    </data> 
    <data> 
     <location>Main Street</location> 
     <source>tgn</source> 
     <id>654321</id> 
    </data> 
</geographicSubject> 
+2

méthode de Nice de choisir dynamiquement le nom de l'élément correct par la position –

+0

Merci pour la réponse, Alejandro. Je n'ai pas encore pu le tester, mais merci! –

+0

@s. nakasone: Vous êtes les bienvenus. –

Questions connexes