2016-12-05 110 views
1

我具有以下XML,元素是動態生成的,並且可以從隨時間改變,因此我不能硬代碼字段名稱,XML屬性來元件使用XSLT

<?xml version="1.0" encoding="UTF-8" standalone="no"?> 
    <datacollection id="amazon_order.1"> 
    <table name="order_detail"> 
     <row name="default_options"> 
      <field name="zipCode">800227028</field> 
      <field name="customerLastName">COMER</field> 
      <field name="state">CO</field> 
      <field name="city">COMMERCE CITY</field> 
      <field name="serialNumber">818243CX601252Y</field>   
     </row> 
    </table> 
    </datacollection> 

並希望將其轉變成以下使用XSLT格式,

<datacollection id="amazon_order.1"> 
<table name="order_detail"> 
    <row name="default_options"> 
     <zipCode>800227028</zipCode> 
     <customerLastName>COMER</customerLastName> 
     <state>CO</state> 
     <city>COMMERCE CITY</city> 
     <serialNumber>818243CX601252Y</serialNumber>      
    </row> 
</table> 
</datacollection> 
+0

所以,你要每個''元素轉換爲由原始元素的'name'屬性命名的元素,其他所有內容都保持不變? –

+0

是的,一切都應該保持原樣。 –

回答

2

要變換<field>元素具有與原始元素的屬性衍生變量名輸出元素。這需要一個匹配原始元素的模板,並通過XSL element元素創建相應的新元素。您希望保持其他所有內容相同,以便調用身份變換來處理其他內容,包括前後元素的內部和外部。

假設你<field>元素將永遠不會有需要結轉到結果文檔比name其他屬性,應該是這樣的:

<?xml version="1.0"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

    <!-- identity transform for otherwise-unmatched nodes and attributes --> 
    <xsl:template match="@*|node()"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*|node()" /> 
    </xsl:copy> 
    </xsl:template> 

    <!-- transform for field elements at any depth --> 
    <xsl:template match="field"> 
    <xsl:element name="{@name}"> 
     <!-- transform this node's non-attribute children --> 
     <xsl:apply-templates select="node()" /> 
    </xsl:element> 
    </xsl:template> 

</xsl:stylesheet> 
+0

謝謝,我爲我工作 –