如何使用xslt从xml获取子标记以及不同的父标记

时间:2012-03-13 07:19:10

标签: xslt

考虑以下输入xml文件

 <Content>
      <content1>
         <first> Hi  <dynVar name="abc" /> All </first>
         <second>this is</second>
      <content1>
      <third>input <dynVar name="def" /> xml content</third>
      <fourth> <dynVar name="ghi" /> </fourth>
      <fifth> <dynVar name="jkl" /> <dynVar name="mno" /></fifth>
 <Content>

使用上面的xml文件我想编写一个xslt,以便我输出xml文件之后 转型将如下所示 目标xml文件:

 <aaa>
     <bbb>
         <ccc> Hi  <dynVar name="abc" /> All </ccc>
         <ddd>this is</ddd>
     <bbb>
     <eee>input <dynVar name="def" /> xml content</eee>
     <fff> <dynVar name="ghi" /> </fff>
     <ggg> <dynVar name="jkl" /> <dynVar name="mno" /></ggg>
 <aaa>

并且输出文件不应该 包含与之关联的任何名称空间 输入的xml文件 任何人都可以为此提供解决方案吗?

1 个答案:

答案 0 :(得分: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:template match="/">
        <xsl:apply-templates/>
    </xsl:template>

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

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

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

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

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

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

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

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

</xsl:stylesheet>

应用于您的输入,这会给出

<?xml version="1.0" encoding="UTF-8"?>
<aaa>
    <bbb>
        <ccc> Hi  <dynVar name="abc"/> All </ccc>
        <ddd>this is</ddd>
    </bbb>
    <eee>input <dynVar name="def"/> xml content</eee>
    <fff>
        <dynVar name="ghi"/>
    </fff>
    <ggg>
        <dynVar name="jkl"/>
        <dynVar name="mno"/>
    </ggg>
</aaa>

为了排除名称空间,请将属性exclude-result-prefixes =“x y z”添加到stylesheet元素,其中x,y和z是另外声明的名称空间。

实现完全相同的较短版本,但没有为必须替换节点名称的每个节点提供模板:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" exclude-result-prefixes="">
    <xsl:output method="xml" indent="yes"/>
    <xsl:template match="/">
        <xsl:apply-templates/>
    </xsl:template>

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

    <xsl:template match="*[name() != 'dynVar']">
        <xsl:variable name="eltName">
            <xsl:choose>
                <xsl:when test="name()='Content'">aaa</xsl:when>
                <xsl:when test="name()='content1'">bbb</xsl:when>
                <xsl:when test="name()='first'">ccc</xsl:when>
                <xsl:when test="name()='second'">ddd</xsl:when>
                <xsl:when test="name()='third'">eee</xsl:when>
                <xsl:when test="name()='fourth'">fff</xsl:when>
                <xsl:when test="name()='fifth'">ggg</xsl:when>
                <xsl:otherwise>error</xsl:otherwise>
            </xsl:choose>
        </xsl:variable>
        <xsl:element name="{$eltName}">
            <xsl:apply-templates/>
        </xsl:element>
    </xsl:template>

</xsl:stylesheet>