2016-12-05 79 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

谢谢,我为我工作 –