我在论坛中使用了一些代码来包装节点内的一些子节点,但现在我正在努力获得一个标题到根节点。下面是我要转换的xml示例:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<A>
<B>
<C>stuff</C>
<D>stuff1</D>
<E>stuff2</E>
</B>
<B>
<C>stuff3</C>
<D>stuff4</D>
<E>stuff5</E>
</B>
</A>
,这是我需要的:
<?xml version="1.0"?>
<A>
<H>heading</H>
<B>
<C>stuff</C>
<ExtraInfo>
<D>stuff</D>
<E>stuff2</E>
</ExtraInfo>
</B>
<B>
<C>stuff3</C>
<ExtraInfo>
<D>stuff4</D>
<E>stuff5</E>
<ExtraInfo>
</B>
</A>
这是我使用的xsl:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:ex="http://exslt.org/dates-and-times" extension-element-prefixes="ex">
<xsl:template match="node()|@*" name="identity">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="B/*"/>
<xsl:template match="B/C">
<xsl:call-template name="identity"/>
</xsl:template>
<xsl:template match="B/*[not(self::C )][1]">
<ExtraInfo>
<xsl:apply-templates select="D/*"
mode="ExtraInfo"/>
<D><xsl:value-of select="//D"/></D>
<xsl:apply-templates select="E/*"
mode="ExtraInfo"/>
<E><xsl:value-of select="//E"/></E>
</ExtraInfo>
</xsl:template>
<xsl:template match="B/*" mode="ExtraInfo">
<xsl:call-template name="identity"/>
</xsl:template>
</xsl:stylesheet>
,结果如下:
<?xml version="1.0" ?>
- <A>
- <B>
<C>stuff</C>
- <ExtraInfo>
<D>stuff1</D>
<E>stuff2</E>
</ExtraInfo>
</B>
- <B>
<C>stuff3</C>
- <ExtraInfo>
<D>stuff1</D>
<E>stuff2</E>
</ExtraInfo>
</B>
</A>
如果我尝试为根节点放入模板,我得到一个错误告诉我,我不能有2个更高级别的元素,或一些这样的。如何插入页眉?
为A
元素添加一个模板,即
<xsl:template match="A">
<xsl:copy>
<H>Heading</H>
<xsl:apply-templates/>
</xsl:copy>
</xsl:template>