Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.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标记的XSL代码_Xml_Xslt - Fatal编程技术网

更改现有xml标记并添加新xml标记的XSL代码

更改现有xml标记并添加新xml标记的XSL代码,xml,xslt,Xml,Xslt,我有以下示例XML文件,其中包含1000个标记 <AAA> <BBB> <CCC> <DDD> <EEE> <1>abc</1> <2>abc</2> <3>abc</3> <4>abc</4> </EEE> </DDD> </CCC&

我有以下示例XML文件,其中包含1000个标记

<AAA>
 <BBB>
  <CCC>
   <DDD>
    <EEE>
     <1>abc</1>
     <2>abc</2>
     <3>abc</3>
     <4>abc</4>
    </EEE>
   </DDD>
  </CCC>
 </BBB>
</AAA>

abc
abc
abc
abc
我需要将其转换为以下内容(添加带有两个子标记的标记5并更新标记1)


kkkkkkk
abc
abc
abc
abc
abc
我不能同时做这两件事,即我可以更新标记1或添加标记5。我需要两者都能做到。我使用以下xsl转换添加标记5

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

 <xsl:template match="e:AAA/e:BBB/e:CCC/e:DDD/e:EEE">   
    <xsl:copy>              
     <xsl:copy-of select="*"/>
      <5>
        <a>abc</a>
        <b>abc</b>
      </5>
    </xsl:copy>     
</xsl:template>

abc
abc
无论我尝试什么,我都无法更新标记1-select=“*”的副本似乎覆盖了它。
任何关于如何实现更新和添加的想法都非常感谢。

简单,-只需从您的副本中排除
(但是XML名称不能以数字开头,所以我称之为
):


kkkkkkkkkk
abc
abc
只有当您想替换第一个元素并在最后附加一个新元素时,上述方法才真正有效,在所有其他情况下,它会打乱元素顺序

假设要替换
,使用与
匹配的模板会更好,因为它可以保持输入元素的顺序:

<xsl:template match="e:AAA/e:BBB/e:CCC/e:DDD/e:EEE">   
  <xsl:copy>
    <xsl:apply-templates select="*" />
    <tag5>
      <a>abc</a>
      <b>abc</b>
    </tag5>
  </xsl:copy>     
</xsl:template>

<xsl:template match="tag2">
    <xsl:copy>zzzzzzzzzz</xsl:copy>
</xsl:template>

abc
abc
zzzzzzzz
使用
的方法比使用
的方法更灵活:要在
之后插入新元素,可以使用以下模板:

<xsl:template match="tag3">
    <xsl:copy-of select="." />
    <tag3-1>zzzzzzzzzz</tag3-1>
</xsl:template>

zzzzzzzz

哇,谢谢托马拉克。我对XSLT的了解很少,仅限于黑客。我一直在把头发扯得乱七八糟,很高兴听到这对你有帮助!我在更新上面的tag2时遇到了一个问题。我必须使用e:tag2(默认为ns)。我可以使用zzzz更改值,但我需要使用计算。我试过使用
应该可以。
<xsl:template match="e:AAA/e:BBB/e:CCC/e:DDD/e:EEE">   
  <xsl:copy>
    <xsl:apply-templates select="*" />
    <tag5>
      <a>abc</a>
      <b>abc</b>
    </tag5>
  </xsl:copy>     
</xsl:template>

<xsl:template match="tag2">
    <xsl:copy>zzzzzzzzzz</xsl:copy>
</xsl:template>
<xsl:template match="tag3">
    <xsl:copy-of select="." />
    <tag3-1>zzzzzzzzzz</tag3-1>
</xsl:template>