我有一段 XML,如下所示:
<LISTOFHARDWARE>
<HARDWARE>
<item>
<SERIALNUMBER>D4242050101</SERIALNUMBER>
<STATUS>2 </STATUS>
<STATUSREASON>998 </STATUSREASON>
<MACADDRESS />
<LINKEDSMARTCARD>4135237101</LINKEDSMARTCARD>
<PRODUCTDETAIL>
<TYPE>DEVICE</TYPE>
<MODEL>ABC123</MODEL>
</PRODUCTDETAIL>
</item>
<item>
<SERIALNUMBER>D4242050101</SERIALNUMBER>
<STATUS>2 </STATUS>
<STATUSREASON>998 </STATUSREASON>
<MACADDRESS />
<LINKEDSMARTCARD>4135237101</LINKEDSMARTCARD>
<PRODUCTDETAIL>
<TYPE>DEVICE</TYPE>
<MODEL>ABC123</MODEL>
</PRODUCTDETAIL>
</item>
</HARDWARE>
</LISTOFHARDWARE>
我希望将<item>
元素替换为<HARDWARE>
元素(直接父元素),并<HARDWARE>
删除父元素,以便结果如下所示:
<LISTOFHARDWARE>
<HARDWARE>
<SERIALNUMBER>D4242050101</SERIALNUMBER>
<STATUS>2 </STATUS>
<STATUSREASON>998 </STATUSREASON>
<MACADDRESS />
<LINKEDSMARTCARD>4135237101</LINKEDSMARTCARD>
<PRODUCTDETAIL>
<TYPE>DEVICE</TYPE>
<MODEL>ABC123</MODEL>
</PRODUCTDETAIL>
</HARDWARE>
<HARDWARE>
<SERIALNUMBER>D4242050101</SERIALNUMBER>
<STATUS>2 </STATUS>
<STATUSREASON>998 </STATUSREASON>
<MACADDRESS />
<LINKEDSMARTCARD>4135237101</LINKEDSMARTCARD>
<PRODUCTDETAIL>
<TYPE>DEVICE</TYPE>
<MODEL>ABC123</MODEL>
</PRODUCTDETAIL>
</HARDWARE>
</LISTOFHARDWARE>
有没有一种方法可以在 XSL 转换中执行此操作,该转换适用于任何包含<item>
元素的 XML 文件?
编辑
在得到这个答案的帮助和进一步的研究之后,我几乎就在那里,但并不完全。考虑以下:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()" />
</xsl:copy>
</xsl:template>
<!-- Replace <item> with name of parent element -->
<xsl:template match="item">
<xsl:element name="{name(..)}">
<xsl:apply-templates select="@*|node()" />
</xsl:element>
</xsl:template>
<!-- Remove immediate parent of <item> elements -->
<xsl:template match="item/.."> <!-- Results in syntax error -->
<xsl:apply-templates select="@*|node()" />
</xsl:template>
</xsl:stylesheet>
问题是,在成功将元素更改<item>
为父元素的名称后,我无法item
通过动态引用其父元素来删除任何元素的父元素。