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:我们已经帮助了你很多,考虑到你的其他代码/处理器/平台/处理错误的可能性。是的,你是对的:我非常感谢你的帮助,马蒂亚斯和用户以及这两种解决方案都是有效的,在我的代码中,错误是在我进行转置之后发生的,因此它消失了。