今天简单的问题:)。我试图从节点切割数据并将其粘贴到另一个节点的数据末尾。
所以看起来应该是这样的:
<x>
<a>1234</a>
<b>5678</b>
</x>
期望的输出
<x>
<a>12345678</a>
</x>
我目前的测试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>
我知道某些内容应该在<xsl:copy>
标签中,但我真的不知道是什么。尝试过一些没有用的东西。帮助赞赏谢谢
编辑:我刚刚意识到我的问题稍微复杂一些,我现在应该说明原因。
我的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>
期望的输出
<root>
<payload>012345678</payload>
<metadata>
<metadata-element>
<key>key</key>
<value>value</value>
</metadata-element>
</metadata>
</root>
答案 0 :(得分:2)
怎么样:
<?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>
编辑:
因为你说它们应该按值选择(我假设它是<key>
元素的值):
<xsl:template match="/">
<root>
<xsl:for-each select="root/payload">
<xsl:copy>
<xsl:value-of select="concat(., following-sibling::metadata[metadata-element/key='foo'][1]/metadata-element/value)" />
</xsl:copy>
<xsl:copy-of select="following-sibling::metadata[metadata-element/key='key'][1]"/>
</xsl:for-each>
</root>
</xsl:template>
答案 1 :(得分:1)
使用您选择向我们展示的输入结构,此样式表将执行此操作。
编辑:更新了样式表
<?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>
我知道应该有标签,但我不是 知道什么。
请注意,xsl:copy将上下文中的节点复制到输出树。如果模板与a
元素匹配,则此指令将a
复制到输出树。您在xsl:copy
内编写的任何XLST代码都将放在复制元素内。
我很清楚你的输入XML实际上是非常不同的,但是你没有将它包含在内。因此,我的帖子只是回答你的要求。