2017-09-29 55 views
1

我是XSLT新手。我有要求将包含名称值对的XML转换为目标XML。 我需要生成一个目标XML,其中每个FieldName是一个元素名称,它的值是FieldValue。请在下面找到我需要的输出。 在此先感谢您的帮助。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>