2017-09-29 5 views
1

Je suis nouveau sur XSLT. J'ai une exigence pour convertir un XML contenant la paire de valeurs de nom en XML cible. J'ai besoin de générer un XML cible où chaque FieldName est un nom d'élément et sa valeur est FieldValue. Veuillez trouver ci-dessous la sortie dont j'ai besoin. Merci d'avance pour l'aide.XSLT: Nécessité de convertir le contenu de la paire de noms en XML

Source XML:

<SC> 
 
\t <Header> 
 
\t \t <Record> 
 
\t \t \t <FieldName>Schema</FieldName> 
 
\t \t \t <FieldValue>OrderHeader</FieldValue> 
 
\t \t </Record> 
 
\t \t <Record> 
 
\t \t \t <FieldName>Order</FieldName> 
 
\t \t \t <FieldValue>1234</FieldValue> 
 
\t \t </Record> 
 
\t </Header> 
 
\t <Detail> 
 
\t \t <Record> 
 
\t \t \t <FieldName>Schema</FieldName> 
 
\t \t \t <FieldValue>OrderItem</FieldValue> 
 
\t \t </Record> 
 
\t \t <Record> 
 
\t \t \t <FieldName>Item</FieldName> 
 
\t \t \t <FieldValue>1</FieldValue> 
 
\t \t </Record> 
 
\t \t <Record> 
 
\t \t \t <FieldName>Qty</FieldName> 
 
\t \t \t <FieldValue>10</FieldValue> 
 
\t \t </Record> 
 
\t </Detail> 
 
\t <Detail> 
 
\t \t <Record> 
 
\t \t \t <FieldName>Schema</FieldName> 
 
\t \t \t <FieldValue>OrderItem</FieldValue> 
 
\t \t </Record> 
 
\t \t <Record> 
 
\t \t \t <FieldName>Item</FieldName> 
 
\t \t \t <FieldValue>2</FieldValue> 
 
\t \t </Record> 
 
\t \t <Record> 
 
\t \t \t <FieldName>Qty</FieldName> 
 
\t \t \t <FieldValue>20</FieldValue> 
 
\t \t </Record> 
 
\t </Detail> 
 
</SC>

XML cible à générer:

<SC> 
 
    <OrderHeader> 
 
     <Order>1234</Order> 
 
    </OrderHeader> 
 
    <OrderItem> 
 
     <Item>1</Item> 
 
     <Qty>10</Qty> 
 
    </OrderItem> 
 
    <OrderItem> 
 
     <Item>2</Item> 
 
     <Qty>20</Qty> 
 
    </OrderItem> 
 
</SC>

XSLT que j'ai essayé: Je ne reçois pas e e de sortie désirée

<xsl:template match="Header"> 
    <xsl:apply-templates select="Record"/> 
</xsl:template> 
<xsl:template match="Record"> 
    <xsl:if test="FieldName = 'Structure'"> 
     <xsl:element name="{FieldValue}"> 
      <xsl:value-of select="./text()"/> 
     </xsl:element> 
    </xsl:if> 

    <xsl:element name="{FieldName}"> 
     <xsl:value-of select="FieldValue"/> 
    </xsl:element> 
</xsl:template> 

Répondre

0

Voici une autre option qui est similaire à Martin.

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <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="Header|Detail"> 
    <xsl:element name="{Record[1]/FieldValue}"> 
     <xsl:apply-templates select="Record[position()>1]"/> 
    </xsl:element> 
    </xsl:template> 

    <xsl:template match="Record"> 
    <xsl:element name="{FieldName}"> 
     <xsl:value-of select="FieldValue"/> 
    </xsl:element> 
    </xsl:template> 

</xsl:stylesheet> 
0

Il semble que vous voulez traiter le premier enfant Record comme un élément conteneur et les frères et sœurs suivants doivent être transformés comme dans votre description:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    exclude-result-prefixes="xs" 
    version="2.0"> 

    <xsl:output indent="yes"/> 

    <xsl:template match="SC"> 
     <xsl:copy> 
      <xsl:apply-templates select="*/Record[1]"/> 
     </xsl:copy> 
    </xsl:template> 

    <xsl:template match="SC/*/Record[1]"> 
     <xsl:element name="{FieldValue}"> 
      <xsl:apply-templates select="following-sibling::Record"/> 
     </xsl:element> 
    </xsl:template> 

    <xsl:template match="SC/*/Record[position() gt 1]"> 
     <xsl:element name="{FieldName}"> 
      <xsl:value-of select="FieldValue"/> 
     </xsl:element> 
    </xsl:template> 

</xsl:stylesheet>