2017-07-27 2 views
2

je l'entrée XML suivant:Transformer nombres à chiffres romains en transformant un fichier XML via XSLT

<root> 
    <calc> 
     <arab>42</arab> 
    </calc> 
    <calc> 
     <arab>137</arab> 
    </calc> 
</root> 

Je veux génèrerait les éléments suivants:

<root> 
    <calc> 
     <roman>XLII</roman> 
     <arab>42</arab> 
    </calc> 
    <calc> 
     <roman>CXXXVII</roman> 
     <arab>137</arab> 
    </calc> 
</root> 

En écrivant un XSLT. Jusqu'à présent, j'ai écrit ce XSLT, mais quoi d'autre doit être fait pour produire la bonne sortie?

<?xml version="1.0" encoding="UTF-8"?> 
    <xsl:transform 
     xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
     xmlns:xs="http://www.w3.org/2001/XMLSchema" 
     xmlns:num="http://whatever" 
     version="2.0" exclude-result-prefixes="xs num"> 

     <xsl:output method="xml" version="1.0" 
     encoding="UTF-8" indent="yes"/> 


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

    </xsl:transform> 

Répondre

4

Essayez:

<xsl:template match="calc"> 
    <xsl:copy> 
     <roman> 
      <xsl:number value="arab" format="I"/> 
     </roman> 
     <xsl:apply-templates/> 
    </xsl:copy> 
</xsl:template> 

numéros

devrait être compris entre 1 et 3999.

Pour valider que les chiffres sont dans la gamme de 1 à 3999, vous pouvez faire:

<xsl:template match="calc"> 
    <xsl:copy> 
     <xsl:choose> 
      <xsl:when test="1 le number(arab) and number(arab) le 3999"> 
       <roman> 
        <xsl:number value="arab" format="I"/> 
       </roman> 
      </xsl:when> 
      <xsl:otherwise> 
       <xsl:message terminate="no">Please enter a number between 1 and 3999</xsl:message> 
      </xsl:otherwise> 
     </xsl:choose> 
     <xsl:apply-templates/> 
    </xsl:copy> 
</xsl:template> 

Notez que Saxon au moins supporte chiffres romains jusqu'à 9999: http://xsltransform.net/bEzjRKe

+0

Vous voulez probablement inclure un tour ' ..' la sortie, mais pourquoi insister sur XSLT 1 ou 2? Cette solution fonctionne avec ou. – Flynn1179

+1

@ Flynn1179 Merci pour la capture .-- Quant à la version, j'ai demandé pour savoir où chercher une réponse. Comme il arrive, la réponse fonctionne également dans XSLT 1.0, mais ce n'est pas toujours le cas. –

+0

Comment puis-je ajouter une validation? Quand entrer le numéro 0 devrait être une erreur et que le XSLT peut gérer des nombres jusqu'à 3xxx. Donc la lettre la plus haute requise des nombres romains sera 'M'. Ainsi, par exemple, tout nombre supérieur à 3999 devrait être invalidé. Donc, en chiffres courts devrait être entre 1 et 3999. – habed