【问题标题】:Removing and copying XML elements with XSLT使用 XSLT 删除和复制 XML 元素
【发布时间】:2015-03-12 22:35:24
【问题描述】:

使用 XSLT,我想转换一个具有以下结构的 XML 文件:

<e1>
  <e2 a="a1" b="b1" c="c1">
    <e3 foo="a"/>
    <e3 foo="b"/>
    <e3 foo="c"/>
    ...
  </e2>
  <e2 a="a2" b="b2" c="c2">
    <e3 foo="d"/>
    ...
  </e2>
  ...
</e1>

进入:

<e1>
  <e2 a="a1" b="b1" c="c1">
    <e3 a="a1" b="b1" e="e"/>
  </e2>
  <e2 a="a2" b="b2" c="c2">
    <e3 a="a2" b="b2" e="e"/>
  </e2>
  ...
</e1>

换句话说:我需要完全删除 e3 元素,并将它们替换为包含 e2 元素的副本,并将其名称更改为 e3;将一些属性(例如 a、b)复制到新元素,并添加一些新属性(例如 e)。

其他任何东西都必须保持原样。

提前谢谢你。

【问题讨论】:

  • 问题不够清楚。 1. 你是什么意思用封闭的e2元素的副本替换它们,它的名称更改为e3,因为我仍然可以看到e2和@ 987654324@ 输出中的元素。 2. 请具体说明要复制的属性,不要让我们假设什么。
  • @LingamurthyCS,新的 e3 元素是封闭 e2 元素的副本,其中删除了一些属性,并添加了一些属性。要复制的属性 - 如示例 a 和 b,删除 c,添加 e。
  • 您要删除哪些属性,要添加哪些属性?
  • @LingamurthyCS,我已经编辑了之前的评论。复制 a 和 b,删除 c,添加 e。
  • "e 已添加"。值来自...?

标签: xml xslt


【解决方案1】:

也许这对你有用:

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="e2[e3]">   
    <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
        <e3 a="{@a}" b="{@b}" e="e"/>
    </xsl:copy>
</xsl:template>

<xsl:template match="e3"/>

</xsl:stylesheet>

它删除所有现有的 e3 元素,并且 - 对于任何包含至少一个 e3 子元素的 e2 元素 - 添加一个新的 e3 元素,从父 e2 并添加一个新的 @e 属性。其他所有内容按原样复制。

【讨论】:

    猜你喜欢
    • 2019-11-17
    • 1970-01-01
    • 2016-06-13
    • 2019-08-14
    • 1970-01-01
    • 1970-01-01
    • 2011-07-08
    • 2018-05-12
    • 1970-01-01
    相关资源
    最近更新 更多