我有以下XML,元素是动态生成的,可以不时更改,因此我不能硬编码字段名,
<?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 :(得分:2)
您希望将<field>
元素转换为具有从原始元素属性派生的变量名称的输出元素。这需要一个匹配原始元素的模板,并通过XSL element
元素创建相应的新元素。您希望保持其他所有内容相同,以便调用标识转换来处理以前<field>
元素外部和内部的所有其他内容。
假设您的<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>