Xslt 将元素复制到现有元素或创建新元素(如果不存在)

标签 xslt

对 xml 转换相当陌生,我陷入了(可能对你来说)非常简单的任务。 让我们建议我们有来源:

<root>
  <someValue>123</someValue>
</root>

应将其转换为:

<root>
 <additional>
   <someValue>123</someValue>
 </additional>
</root>

但是如果我们有这个作为来源:

<root>
 <additional>
  <b>something</b>
 </additional>
 <someValue>123</someValue>
</root>

我们应该将someValue移动到现有的additional,即:

<root>
 <additional>
  <b>something</b>
  <someValue>123</someValue>
 </additional>     
</root>

请记住,a级别上可能存在具有相同行为的其他元素(移至附加下)。 好吧,非常感谢工作示例,但如果它附有对其工作原理的简短描述,那就太棒了(我更喜欢钓鱼,而不是仅仅用它来喂食)。

最佳答案

一种可能的方法是添加一个additional 包装器作为root 的子级,并删除现有的additional 包装器 - 因此其子级向上移动成为root 的子级(或者更确切地说是添加的additional 包装器的子级):

XSLT 1.0

<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:strip-space elements="*"/>

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

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

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

</xsl:stylesheet>

关于Xslt 将元素复制到现有元素或创建新元素(如果不存在),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55418018/

相关文章:

xml - XSL : why doesn't output indent work?

xml - 将字符串转换为 XSLT 中的日期格式

xml - 如何使用 XPath 和 XSLT 处理一组兄弟节点并根据其中两个兄弟节点处理特定的兄弟节点子集

xslt - XSL msxsl :node-set problem

java - 如何从 XSLT 中的串联变量中清除噪声字符

xslt - 如何在 XSLT 的输出中包含通过 xpath 参数选择的节点的祖先分支

string - 如何将 xslt 模板应用于字符串?

java - XSL。以字符串形式传递参数

html - 如何在文本来自处理指令的 xsl 中取消转义字符

xml - 如何创建 boolean 值?