2017-07-01 2 views
0

J'essaye de convertir un formulaire XML envoyé à mon backend en utilisant un modèle générique au modèle XML interne que le système utilise en utilisant XSLT.Transformation XSLT d'un modèle générique vers un modèle spécifique

Le modèle générique se compose de sections, de lignes et de tableaux (un tableau est essentiellement un tableau/groupe d'éléments). Les PK sont issus de la séquence pour le tableauRow et le nombre maxPK est un nombre. MaxPK Je peux probablement remplir après, pas sûr si c'est possible par XSLT.

Toute aide serait appréciée!

Modèle générique

<form> 
    <section> 
     <name>identification</name> 
     <sequence>1</sequence> 
     <line> 
      <sequence>0</sequence> 
      <field> 
       <name>firstName</name> 
       <value>JOHN</value> 
      </field> 
     </line> 
     <line> 
      <sequence>1</sequence> 
      <field> 
       <name>lastName</name> 
       <value>DOE</value> 
      </field> 
     </line> 
    </section> 
    <section> 
     <name>contactDetails</name> 
     <sequence>1</sequence> 
     <line> 
      <sequence>0</sequence> 
      <field> 
       <name>primaryPhone</name> 
       <value>+44 100 1234</value> 
      </field> 
     </line> 
     <table> 
      <name>secondaryPhoneGroup</name> 
      <tableRow> 
       <sequence>1</sequence> 
       <field> 
        <sequence>0</sequence> 
        <name>secondaryPhone</name> 
        <value>+44 100 1235</value> 
       </field> 
      </tableRow> 
      <tableRow> 
       <sequence>2</sequence> 
       <field> 
        <sequence>0</sequence> 
        <name>secondaryPhone</name> 
        <value>+44 100 1236</value> 
       </field> 
      </tableRow> 
     </table> 
    </section> 
</form> 

Modèle interne

<form> 
    <identification> 
     <firstName> 
      <asCurrent>JOHN</asCurrent> 
     </firstName> 
     <lastName> 
      <asCurrent>DOE</asCurrent> 
     </lastName> 
    </identification> 
    <contactDetails> 
     <primaryPhone> 
      <asCurrent>+44 100 1234</asCurrent> 
     </primaryPhone> 
     <secondaryPhoneGroup> 
      <secondaryPhone> 
       <pk>1</pk> 
       <phone> 
        <asCurrent>+44 100 1235</asCurrent> 
       </phone> 
      </secondaryPhone> 
      <secondaryPhone> 
       <pk>2</pk> 
       <phone> 
        <asCurrent>+44 100 1236</asCurrent> 
       </phone> 
      </secondaryPhone> 
      <maxPK>2</maxPK> 
     </secondaryPhoneGroup> 
    </contactDetails> 
</form> 
+1

Quels sont donc les règles, qu'avez-vous essayé? Où les données pour, par exemple, 'pk' et' maxPK' de, est-ce juste la position respectivement le nombre d'éléments? –

+0

S'il vous plaît poster des solutions comme des réponses pas comme des mises à jour à votre question. Ceci afin d'éviter toute confusion et d'aider les futurs visiteurs. Vous pouvez trouver la solution supprimée dans vos [révisions] (https://stackoverflow.com/posts/44864560/revisions). Je vous remercie. – Bugs

Répondre

1

Essayez le long des lignes suivantes:

<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"> 

    <xsl:output indent="yes"/> 
    <xsl:strip-space elements="*"/> 

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

    <xsl:template match="line"> 
     <xsl:apply-templates/> 
    </xsl:template> 

    <xsl:template match="sequence"/> 

    <xsl:template match="section | field"> 
     <xsl:element name="{name}"> 
      <xsl:apply-templates select="* except name"/> 
     </xsl:element> 
    </xsl:template> 

    <xsl:template match="*[name]/value"> 
     <asCurrent> 
      <xsl:apply-templates/> 
     </asCurrent> 
    </xsl:template> 

    <xsl:template match="table"> 
     <xsl:element name="{name}"> 
      <xsl:apply-templates select="* except name"/> 
      <maxPK> 
       <xsl:value-of select="count(tableRow)"/> 
      </maxPK> 
     </xsl:element> 
    </xsl:template> 

    <xsl:template match="tableRow"> 
     <xsl:element name="{field/name}"> 
      <xsl:apply-templates select="* except name"/> 
     </xsl:element> 
    </xsl:template> 

    <xsl:template match="tableRow/sequence"> 
     <pk> 
      <xsl:apply-templates/> 
     </pk> 
    </xsl:template> 

    <xsl:template match="tableRow/field[name = 'secondaryPhone']"> 
     <phone> 
      <xsl:apply-templates select="value"/> 
     </phone> 
    </xsl:template> 

</xsl:transform> 
+0

Nous vous remercions de votre aide! J'ai fait une erreur dans ma spécification d'origine qui l'a rendu plus confuse, mais avec votre aide, j'ai été capable de le casser! La notation de * excepté le nom n'a pas fonctionné pour moi, mais le remplaçant avec * [pas (le nom de soi]] a fait l'affaire. – Neil

+0

'except' fait partie de XSLT/XPath 2.0 et versions ultérieures, puisque vous avez étiqueté votre question avec cette version, je considérais qu'elle pouvait être utilisée en toute sécurité. Mais vous avez trouvé une expression alternative pour XSLT 1.0. –