Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xml 将某些属性值转换为元素_Xml_Xslt - Fatal编程技术网

Xml 将某些属性值转换为元素

Xml 将某些属性值转换为元素,xml,xslt,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

我正在尝试转换一个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>

0
索引0
我想将此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>

0
索引0
正如我所展示的,我只希望3个属性,即attr1 attr5和attr7成为元素,而其他属性保持原样

<xsl:template match="Parent/NODE/@attr1">
<attr1>
<xsl:attribute name="value"><xsl:value-of select="." /></xsl:attribute>
</attr1>
</xsl:template>


但在对3个属性执行此操作之后,其他属性就不会出现在转换后的xml中。如果您对此有任何帮助,我们将不胜感激。

这并不完美,因为它会重复包含条件两次,但它可以工作:

<?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>


Fiddle:

如果没有XSLT代码的其余部分,很难判断,但是您确定要将其他属性复制到节点中吗?这可能是因为XSLT在复制任何现有属性之前添加了
attr1
元素,而这些属性是您希望保留为属性的。根据规范,这被视为错误(请参阅)。正如该链接中提到的,XSLT处理器必须选择忽略属性。