将一些属性值转换为元素

时间:2017-05-26 14:18:29

标签: xml xslt

我正在尝试转换一个节点包含多个属性的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中。任何有关这方面的帮助将不胜感激

1 个答案:

答案 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>

小提琴:http://xsltransform.net/jxDigTS/1