考虑以下输入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文件 任何人都可以为此提供解决方案吗?
答案 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>