Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/17.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,今天有个简单的问题:)。我正在尝试从一个节点剪切数据,并将其粘贴到另一个节点的数据末尾 所以它应该是这样的: <x> <a>1234</a> <b>5678</b> </x> 1234 5678 期望输出 <x> <a>12345678</a> </x> <root> <payload>012345678</payl

今天有个简单的问题:)。我正在尝试从一个节点剪切数据,并将其粘贴到另一个节点的数据末尾

所以它应该是这样的:

<x>
   <a>1234</a>
   <b>5678</b>
</x>

1234
5678
期望输出

<x>
   <a>12345678</a>
</x>
<root>
   <payload>012345678</payload>
   <metadata>
      <metadata-element>
          <key>key</key>
          <value>value</value>
      </metadata-element>
   </metadata>
</root>

12345678
我目前正在测试xslt:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" >
<xsl:param name="ename">Test</xsl:param>
<xsl:param name="evalue">Test1234</xsl:param>

<xsl:param name="removeElementsNamed" select="'Test'"/>

<xsl:output method="xml" encoding="utf-8"/>
<xsl:template match="@*|node()" name="input">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()" />
    </xsl:copy>
</xsl:template>
<xsl:template match="Record">
    <xsl:copy>
        <xsl:apply-templates/>
            <xsl:if test="not(c)">
                <xsl:element name="{$ename}"><xsl:value-of select="$evalue"/></xsl:element>
            </xsl:if>                
    </xsl:copy>        
</xsl:template>
<xsl:template match="Record">
    <xsl:if test="not(name() = $removeElementsNamed)">
        <xsl:call-template name="input"/>
    </xsl:if>
</xsl:template>

试验
测试1234

我知道一些东西应该在
标签中,但我真的不知道是什么。尝试了几件没用的事。谢谢你的帮助

编辑:我刚刚意识到我的问题稍微复杂一些,现在我应该说明原因

我的xml文件具有以下结构

 <root>
   <payload>01234</payload>
   <metadata>
      <metadata-element>
          <key>key</key>
          <value>value</value>
      </metadata-element>
   </metadata>
   <metadata>
       <metadata-element>
           <key>foo</key>
           <value>5678</value>
       </metadata-element>
   </metadata>
</root>

01234
钥匙
价值
福
5678
期望输出

<x>
   <a>12345678</a>
</x>
<root>
   <payload>012345678</payload>
   <metadata>
      <metadata-element>
          <key>key</key>
          <value>value</value>
      </metadata-element>
   </metadata>
</root>

012345678
钥匙
价值

使用您选择的输入结构,这个样式表就可以了

编辑:更新样式表

<?xml version="1.0" encoding="utf-8"?>

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:output method="xml" indent="yes"/>
<xsl:strip-space elements="*"/>

<xsl:template match="/">
  <xsl:apply-templates/>
</xsl:template>

<xsl:template match="root">
  <xsl:copy>
     <xsl:apply-templates/>
  </xsl:copy>
</xsl:template>

<xsl:template match="payload">
  <xsl:copy>
     <xsl:value-of select="."/>
     <xsl:value-of select="following-sibling::metadata/metadata-element[key='foo']/value"/>
  </xsl:copy>
</xsl:template>

<xsl:template match="metadata[metadata-element/key='key']">
<xsl:copy>
  <xsl:apply-templates/>
</xsl:copy>
</xsl:template>

<xsl:template match="metadata-element|key|value">
<xsl:copy>
  <xsl:apply-templates/>
</xsl:copy>
</xsl:template>

<xsl:template match="metadata[metadata-element/key='foo']"/>

</xsl:stylesheet>

产生以下输出: 编辑:更新的输出

<?xml version="1.0" encoding="UTF-8"?>
<root>
 <payload>012345678</payload>
 <metadata>
  <metadata-element>
     <key>key</key>
     <value>value</value>
  </metadata-element>
 </metadata>
</root>

012345678
钥匙
价值
我知道有些东西应该在标签里,但我真的不知道 知道吗

请注意,xsl:copy将上下文中的节点复制到输出树。如果模板与
a
元素匹配,则本指令将
a
复制到输出树。在
xsl:copy
中编写的任何XLST代码都将放置在复制的元素中

我很清楚,您的输入XML实际上非常不同,但您并没有将其括起来。因此,我的帖子只回答了你的问题。

怎么样:

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

<xsl:template match="/">
<root>
    <xsl:for-each select="root/payload">
        <xsl:copy>
            <xsl:value-of select="concat(., following-sibling::metadata[2]/metadata-element/value)" />
        </xsl:copy>
        <xsl:copy-of select="following-sibling::metadata[1]"/>
    </xsl:for-each>
</root>
</xsl:template>
</xsl:stylesheet> 


编辑:

既然您说应该通过值来选择它们(我假定是通过
元素的值来选择):



这可能要简单得多。为什么不发布一个更真实的输入XML示例呢?我已经编辑了你的标题。请参阅“”,其中一致意见是“不,他们不应该”。这将有助于了解
元素是否应该按顺序或某个值进行选择。@user3016153 by value:)谢谢,但是我意识到我的问题稍微复杂一些。我已经按照顺序编辑了我的问题。对,我已经编辑了我的样式表和输出。让我知道它是否有效。此样式表假定输入XML与您显示的完全相同。如果您想处理其他输入结构,请向我们展示它们,并清楚地说明选择标准是什么,等等……输入xml结构如图所示,整个问题要复杂得多,并且渴望stackoverflow+它并不真正相关。我仍然在运行测试,并改变了一些事情的顺序。也许我有一个错误,在某些地方有一个问题,元数据仍然在它原来的位置,但是负载消失了。您的xslt抛出了illegalArgumentexception:)tag@MaciejCygan我已经用不少于三种不同的处理器(libxslt、Xalan和Saxon)对其进行了测试,和在线服务一样,它在所有四个服务器上都能正常工作。此解决方案工作正常,不会抛出错误@Maciej:我们已经帮助了你很多,考虑到你的其他代码/处理器/平台/处理错误的可能性。是的,你是对的:我非常感谢你的帮助,马蒂亚斯和用户以及这两种解决方案都是有效的,在我的代码中,错误是在我进行转置之后发生的,因此它消失了。