2017-09-29 2 views
1

Ich bin neu in XSLT. Ich habe eine Anforderung, ein XML-Name-Wert-Paar in Ziel-XML zu konvertieren. Ich muss eine Ziel-XML generieren, wobei jeder FieldName ein Elementname ist und der Wert FieldValue ist. Hier finden Sie die Ausgabe, die ich brauche. Vielen Dank im Voraus für die Hilfe.XSLT: Müssen Name Wert Paar Inhalt in XML konvertieren

Quelle 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>

Ziel XML generiert werden:

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

XSLT, die ich versucht: Ich bin nicht th bekommen e gewünschte Ausgabe

<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> 

Antwort

0

Hier ist eine weitere Option, die ähnlich ist zu Martins.

<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

Es scheint, dass Sie die erste Record Kind als Containerelement und die folgenden Geschwister werden transformiert, wie in Ihrer Beschreibung bearbeiten möchten:

<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> 
Verwandte Themen