2010-08-16 7 views
1

J'ai un champ dans mon xml qui ressemble à ceci (quelques exemples):Besoin d'une solution XSLT 1.0 pour ce qui serait une expression régulière relativement simple

<ViolationCharged>VTL0180  0D 0I0</ViolationCharged> 
<ViolationCharged>VTL0180-C  02A 0I0</ViolationCharged> 
<ViolationCharged>VTL1180  B 0I0</ViolationCharged> 

je dois en faire quelque chose qui ressemble à ceci:

<Violation>VTL180.0D</Violation> 
<Violation>VTL180-C.02A</Violation> 
<Violation>VTL1180.B</Violation> 

Fondamentalement, je dois prendre le premier champ de ce bloc et de supprimer les zéros (si elles existent) du bloc numéro, puis combiner ce premier champ avec la seconde avec une période . Je suis un peu un noob XSLT, mais avec 2.0, je crois que je peux le faire avec analyze-string et une expression régulière pas exceptionnellement compliquée, cependant, je ne peux pas envelopper tout ce qui est en 1.0 qui fonctionnera et je suis sorte de forcé à utiliser ce qui est déjà en place ici.

Toute aide est bien sûr très appréciée.

+0

Bonne question (+1). Voir ma réponse pour une solution complète. :) –

Répondre

3

Cette transformation:

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

<xsl:template match="text()"> 
    <xsl:variable name="vNormalized" select="normalize-space()"/> 
    <xsl:variable name="vWithDots" select="translate($vNormalized, ' ', '.')"/> 

    <xsl:variable name="vFinal" select= 
    "concat(substring-before($vWithDots, '.'), 
      '.', 
      substring-before(substring-after($vWithDots, '.'), '.'))"/> 

      <xsl:value-of select="$vFinal"/> 
</xsl:template> 
</xsl:stylesheet> 

lorsqu'il est appliqué sur ce document XML:

<t> 
    <ViolationCharged>VTL0180  0D 0I0</ViolationCharged> 
    <ViolationCharged>VTL0180-C  02A 0I0</ViolationCharged> 
    <ViolationCharged>VTL1180  B 0I0</ViolationCharged> 
</t> 

produit le résultat souhaité, correct:

<t> 
    <ViolationCharged>VTL0180.0D</ViolationCharged> 
    <ViolationCharged>VTL0180-C.02A</ViolationCharged> 
    <ViolationCharged>VTL1180.B</ViolationCharged> 
</t> 
+0

Fermer, mais il ne semble pas supprimer le premier zéro sur le 0180. Cela fait beaucoup pire? – Morinar

+0

Il suffit de remplacer dans la déclaration 'vFinal'' substring-before ($ vWithDots, '.') 'Avec' substring (., 1,3), sous-chaîne (., 5,7) ' –

+0

Cela ne fonctionne pas * assez * comme il couperait le 1 dans le troisième cas. Ce que j'ai fini par faire, cependant, était simplement de vérifier 'VTL0' (et les 3 autres choses possibles que le champ peut commencer) et si ça commence de cette façon, j'effectue la sous-chaîne comme vous le suggérez. Merci pour l'aide! Définitivement m'a mis sur la bonne voie. – Morinar

Questions connexes