需要XSLT将一种形式的XML转换为另一种形式

时间:2013-09-20 09:21:41

标签: xml xslt

我是XSLT的新手。我需要一个XSLT来将我的一种形式的XML转换为另一种形式。以下是输入和输入输出

INPUT

<AssetDataCollection>
<!-- Asset Data will be repeated for each service tag -->
<AssetData>
  <REF_ID_LIST>
    <REF_ID NAME="MANUFACTUREDATE" VALUE="05/03/2013" />
    <REF_ID NAME="REGION" VALUE="DAO" />
    <REF_ID NAME="EMBMAC1" VALUE="D4BED9403E24" />
    <REF_ID NAME="EMBMAC2" VALUE="D4BED9403E24" />
    <REF_ID NAME="EMBMAC3" VALUE="D4BED9403E24" />
    <REF_ID NAME="AC1" VALUE="D4BED9403E24" />
    <REF_ID NAME="MAC2" VALUE="D4BED9403E24" />
    <REF_ID NAME="MAC3" VALUE="D4BED9403E24" />
  </REF_ID_LIST>
</AssetData>
</AssetDataCollection>

输出

<AssetDataCollection>
<!-- Asset Data will be repeated for each service tag -->
<AssetData>
<MANUFACTUREDATE>05/03/2013</MANUFACTUREDATE>
<REGION>DAO</REGION>
<EMBMAC1>D4BED9403E24</EMBMAC1>
<EMBMAC2>D4BED9403E24</EMBMAC2>
<EMBMAC3>D4BED9403E24</EMBMAC3>
<AC1>D4BED9403E24</AC1>
<MAC2>D4BED9403E24</MAC2>
<MAC3>D4BED9403E24</MAC3>
</AssetData>
</AssetDataCollection>

我做了什么

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml"/>
<xsl:template match="/">
    <xsl:apply-templates select="/AssetDatCollection/AssetData/REF_ID_LIST/REF_ID"/>
</xsl:template>
<xsl:template match="REF_ID">
<xsl:variable name="newnam" select=" REF_ID[@NAME]"/>
<xsl:variable name=”newval” select=” REF_ID[@VALUE]”/>
<xsl:text>&lt;</xsl:text><xsl:value-of select="$newnam/@NAME"/><xsl:text>&gt;</xsl:text>
<xsl:value-of select=” REF_ID[@VALUE]”/> <xsl:text>&lt;</xsl:text><xsl:text>/</xsl:text><xsl:value-of select="$newnam/@NAME"/><xsl:text>&gt;</xsl:text>
</xsl:template>

http://www.freeformatter.com/xsl-transformer.html中尝试过,我没有得到正确的输出。

1 个答案:

答案 0 :(得分:1)

您需要使用三个模板,第一个是身份转换

<xsl:template match="@* | node()">
  <xsl:copy>
    <xsl:apply-templates select="@* | node()"/>
  </xsl:copy>
</xsl:template>

第二个确保REF_ID_LIST只处理其子项

<xsl:template match="REF_ID_LIST">
  <xsl:apply-templates/>
</xsl:template>

,第三个通过执行

转换REF_ID元素
<xsl:template match="REF_ID">
  <xsl:element name="{@NAME}">
    <xsl:value-of select="@VALUE"/>
  </xsl:element>
</xsl:template>