2017-09-30 49 views
0

我需要將名稱值對轉換爲XML。我能夠生成一個XML,但元素名稱應該分組,並且不應該重複。請看下面。 FieldValue元素在Detail節點中包含2個OrderItem值。如果帶有OrderItem的FieldValue重複,那麼結果應該分組到一個OrderItem節點中。請幫忙。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:

<Order> 
 
<OrderItem> 
 
    <Item> 
 
     <Item>1</Item> 
 
     <Qty>10</Qty> 
 
    </Item> 
 
    <Item> 
 
     <Item>2</Item> 
 
     <Qty>20</Qty> 
 
    </Item> 
 
</OrderItem> 
 
</Order>

XSLT:

<xsl:template match="@*|node()"> 
<Order> 
    <xsl:for-each select="Detail"> 
     <Item> 
      <xsl:apply-templates select="Record[position()>1]"/> 
     </Item> 
</xsl:for-each> 
</Order> 
</xsl:template> 

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

回答

0

分組可以如下進行:

<?xml version="1.0" encoding="UTF-8"?> 
<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"> 
     <Order> 
      <xsl:for-each-group select="Detail" group-by="Record[1]/FieldValue"> 
       <xsl:element name="{current-grouping-key()}"> 
        <xsl:apply-templates select="current-group()"/> 
       </xsl:element> 
      </xsl:for-each-group> 
     </Order> 
    </xsl:template> 

    <xsl:template match="Detail"> 
     <Item> 
      <xsl:apply-templates select="Record[position() gt 1]"/> 
     </Item> 
    </xsl:template> 

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

</xsl:stylesheet> 
0

看起來您正試圖定義兩個XSLT模板,當一個應該足夠時。你想匹配根,然後你想遍歷每個SC/Detail

然後,您想要獲取'Item'(對於項目值)和'Qty'(對於數量值)的FieldName節點的兄弟的FieldValue,但只包含'Record'下列出的節點的值。

注意:您已在轉換後的輸出中指定了雙嵌套<Item>,此解決方案反映了該需求。

這XSLT應該做您請求的內容:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
    <xsl:template match="/"> 
    <xsl:for-each select="SC/Detail"> 
<Order> 
    <OrderItem> 
    <Item> 
    <Item> 
     <xsl:value-of select="Record[FieldName[text()='Item']]/FieldValue" /> 
    </Item> 
    <Qty> 
     <xsl:value-of select="Record[FieldName[text()='Qty']]/FieldValue" /> 
    </Qty> 
    </Item> 
    </OrderItem> 
</Order> 
</xsl:for-each> 
</xsl:template> 

</xsl:stylesheet> 
+0

您好,感謝您的投入。 OrderItem元素應該從名稱值對動態創建。元素/節點不是靜態的。它是動態的。 – user8696326

+0

該要求在您的問題中提供的代碼中不明確。如果您可以更新您的問題(即更新您期望的目標XML的外觀),那麼我可以爲您更新我的答案。 – jhenderson2099