XSLT删除标记子元素,但保留内容

时间:2016-07-11 15:18:04

标签: xml xslt

我有一个具有以下结构的xml:

<tuple>
    <something>One</something>
    <somethingelse>Two</somethingelse>
    <somethingextra>
        <tuple>
            <somethingextra2>Three</somethingextra2>
        </tuple>
    </somethingextra>
</tuple>

我想弄清楚如何删除子<tuple>元素,同时保留内容。

<tuple>
    <something>One</something>
    <somethingelse>Two</somethingelse>
    <somethingextra>
        <somethingextra2>Three</somethingextra2>
    </somethingextra>
</tuple>

非常欢迎任何帮助或建议。

3 个答案:

答案 0 :(得分:0)

您需要一种方法来区分要删除的根tuple元素和tuple元素。

例如,这将删除具有父元素的任何 tuple元素:

<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="*/tuple">
    <xsl:apply-templates/>
</xsl:template>

</xsl:stylesheet>

答案 1 :(得分:0)

您还可以在遍历XML树时切换到额外模式。在标准模式下,您可以复制所有元素,但是在模式“noTuple&#39;您跳过节点副本并返回正常模式。

productChanged

答案 2 :(得分:0)

michael.hor257k出色地回答了这个问题。 这是我的变化,它也处理了我的一些其他变化。

<?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="@* | node()">
        <xsl:copy>
            <xsl:apply-templates select="@* | node()" />
        </xsl:copy>
    </xsl:template>
    <!-- Convert any atom, table or tuple element to a new element with the name attribute as the element name -->
    <xsl:template match="atom[@name] | table[@name] | tuple[@name]">
        <xsl:element name="{@name}">
            <xsl:apply-templates />
        </xsl:element>
    </xsl:template>
</xsl:stylesheet>