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 XSLT2.0基于属性名删除元素,并添加一组元素_Xml_Xslt - Fatal编程技术网

Xml XSLT2.0基于属性名删除元素,并添加一组元素

Xml XSLT2.0基于属性名删除元素,并添加一组元素,xml,xslt,Xml,Xslt,考虑下面的XML <?xml version="1.0" encoding="UTF-8"?> <p > <node> <e a="1"/> <e a="2"/> </node> <a> <c value="-3" v="RRR_1"/> <c value="1" v="RRR_2"/> <c value="11" v="v1"/&

考虑下面的XML

<?xml version="1.0" encoding="UTF-8"?>
<p >
  <node>
    <e a="1"/>
    <e a="2"/>
  </node>
  <a>
    <c value="-3" v="RRR_1"/>
    <c value="1" v="RRR_2"/>
    <c value="11" v="v1"/>
    <c value="12" v="v2"/>
  </a>
</p>


我想找到所有的c元素,它们的v属性值以RRR开头,并将它们删除 然后我想在末尾附加以下c节点

  <c value="123" v="RRR_134"/>
  <c value="456" v="RRR_233"/>
  <c value="789" v="RRR_900"/>

最后的XML看起来像

<?xml version="1.0" encoding="UTF-8"?>
<p >
  <node>
    <e a="1"/>
    <e a="2"/>
  </node>
  <a>
    <c value="11" v="v1"/>
    <c value="12" v="v2"/>
    <c value="123" v="RRR_134"/>
    <c value="456" v="RRR_233"/>
    <c value="789" v="RRR_900"/>
  </a>
</p>


我编写了以下XSL来删除以RRR开头的具有v属性的c节点,但是如何更改相同的XSL以在末尾添加所需的元素。我可以编写另一个XSL表来完成这项工作,但我想知道是否可以在同一个XSLT文件中完成这项工作

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

  <xsl:template match="/p/a/c[starts-with(@v, 'RRR')]"></xsl:template>

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

  <!-- remove new lines for a deleted element -->
  <xsl:template match="*/text()[normalize-space()]">
    <xsl:value-of select="normalize-space()"/>
  </xsl:template>

</xsl:stylesheet>

一种可能的解决方案是在最后一个
c
元素之后添加节点,如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
   <xsl:output method="xml"  encoding="UTF-8" indent="yes" />
   <xsl:strip-space elements="*"/>
  <xsl:template match="/p/a/c[starts-with(@v, 'RRR')]"/>
  <!-- identity transform --> 
  <xsl:template match="@*|node()">
    <xsl:copy>
      <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
  </xsl:template>
  <xsl:template match="c[position()=last()]">
    <xsl:copy>
      <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
    <c value="123" v="RRR_134"/>
    <c value="456" v="RRR_233"/>
    <c value="789" v="RRR_900"/>
  </xsl:template>
</xsl:stylesheet>

当应用于输入XML时,将生成输出:

<?xml version="1.0" encoding="UTF-8"?>
<p>
  <node>
    <e a="1"/>
    <e a="2"/>
  </node>
  <a>
    <c value="11" v="v1"/>
    <c value="12" v="v2"/>
    <c value="123" v="RRR_134"/>
    <c value="456" v="RRR_233"/>
    <c value="789" v="RRR_900"/>
  </a>
</p>


我还删除了模板以删除已删除元素的换行符,并添加了
和属性为
indent=“yes”
xsl:output
,以生成缩进输出。
匹配最后一个
c
元素的模板复制此元素,然后只写入附加的
c
节点