使用XSLT

时间:2016-10-14 13:34:02

标签: xml xslt

我正在尝试使用XSLT转换数据集。只有一个部分应该获得额外的标签。

<formData>
    <baseFields>
        <elementA>TEST</elementA>
        <elementB>TEST2</elementB>
    </baseFields>
    <dataFields>
        <groupA>
            <elementA>TEST</elementA>
            <elementB>TEST2</elementB>
        </groupA>
        <groupB>
            <elementA>TEST</elementA>
            <elementB>TEST2</elementB>
        </groupB>
    </dataFields>
</formData>

进入

<formData>
    <elementA>TEST</elementA>
    <elementB>TEST2</elementB>
    <groupA>
        <elementA><asCurrent>TEST</asCurrent></elementA>
        <elementB><asCurrent>TEST2</asCurrent></elementB>
    </groupA>
    <groupB>
        <elementA><asCurrent>TEST</asCurrent></elementA>
        <elementB><asCurrent>TEST2</asCurrent></elementB>
    </groupB>
</formData>

应删除baseFields组和dataFields组,并将dataFields部分中的节点或文本元素包装在asCurrent标记中。

任何帮助将不胜感激!

更新 基于Dan Field的帮助,我能够使用以下XSLT处理它。

<?xml version="1.0" encoding="UTF-8" ?>
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/>
    <xsl:strip-space elements="*"/>

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

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

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

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

    <xsl:template match="dataFields//text()">
            <asCurrent><xsl:copy><xsl:apply-templates select="text()"/></xsl:copy></asCurrent>
    </xsl:template>
</xsl:transform>

1 个答案:

答案 0 :(得分:0)

一种方法是使用模板进行简单的身份转换,以匹配您要丢弃的标签,只需应用下一个模板:

<?xml version="1.0" encoding="UTF-8" ?>
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:output method="xml" encoding="UTF-8" indent="yes" />

     <xsl:strip-space elements="*"/>
    <xsl:template match="baseFields">
        <xsl:apply-templates />
    </xsl:template>

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

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

XSLTransform