我在论坛中使用了一些代码来包含一个节点中的一些子节点,但现在我正在努力获得一个进入根节点的标题。以下是我要转换的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个更高级别的元素,或者其他一些元素。如何插入标题?
答案 0 :(得分:0)
为A
元素添加模板,即
<xsl:template match="A">
<xsl:copy>
<H>Heading</H>
<xsl:apply-templates/>
</xsl:copy>
</xsl:template>