2017-09-29 5 views
1

XSLTを初めて使用しました。名前の値のペアを含むXMLをターゲットXMLに変換する必要があります。 それぞれのFieldNameが要素名で、値がFieldValueのターゲットXMLを生成する必要があります。下記の出力が必要です。 ご協力いただきありがとうございます。XSLT:名前の値ペアの内容をXMLに変換する必要があります

ソース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が生成される:私は目が届かない:私が試した

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

XSLT電子所望の出力

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

答えて

0

ここに似ている別のオプションがありますマーティンに

<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

あなたがコンテナ要素として最初Record子を処理したいと、次の兄弟があなたの説明のように変換されることになっているようだ:

<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> 
関連する問題