我正在尝试转换一个节点包含多个属性的xml。其中我想要2或3个属性成为元素并在同一元素中插入一些额外的属性。下面是我要转换的xml结构
<Parent>
<NODE attr1="INDEX" attr2="0" attr3="OFF" attr4="TRANSPARENT_MODE" attr5="HIGH" attr6="0" attr7="0" attr8="TIME">
<value>0</value>
<alias>Index 0</alias>
</NODE >
</Parent>
我想将此xml转换为
<Parent>
<NODE attr2="0" attr3="OFF" attr4="TRANSPARENT_MODE" attr6="0" attr8="TIME">
<attr1 value="INDEX">
<attr5 value="HIGH">
<attr7 value="0">
<value>0</value>
<alias>Index 0</alias>
</NODE >
</Parent>
因为我已经表明我只想要3个属性,即attr1 attr5和attr7是元素,而另一个要保持不变。为此,我尝试了下面的xslt样式
<xsl:template match="Parent/NODE/@attr1">
<attr1>
<xsl:attribute name="value"><xsl:value-of select="." /></xsl:attribute>
</attr1>
</xsl:template>
但是在为3个属性执行此操作之后,其他属性不会出现在转换后的xml中。任何有关这方面的帮助将不胜感激
答案 0 :(得分:1)
这并不完美,因为它重复了两次包含的条件,但它确实有效:
<?xml version="1.0" encoding="UTF-8" ?>
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
<xsl:output method="html" doctype-public="XSLT-compat" omit-xml-declaration="yes" encoding="UTF-8" indent="yes" />
<xsl:template match="/">
<xsl:apply-templates/>
</xsl:template>
<xsl:template match="NODE">
<xsl:copy>
<xsl:for-each select="@*[name()!='attr1' and name()!='attr3']">
<xsl:copy />
</xsl:for-each>
<xsl:for-each select="@*[name()='attr1' or name()='attr3']">
<xsl:element name="{name()}">
<xsl:attribute name="value" select="."/>
</xsl:element>
</xsl:for-each>
<xsl:for-each select="node()">
<xsl:copy-of select="." />
</xsl:for-each>
</xsl:copy>
</xsl:template>
</xsl:transform>