Xml 匹配下层节点后将元素放入根节点
我在论坛中使用了一些代码来包装一个节点中的多个子节点,但是现在我很难在根节点中找到一个标题。下面是我要转换的xml示例:Xml 匹配下层节点后将元素放入根节点,xml,xslt,Xml,Xslt,我在论坛中使用了一些代码来包装一个节点中的多个子节点,但是现在我很难在根节点中找到一个标题。下面是我要转换的xml示例: <?xml version="1.0" encoding="UTF-8" standalone="yes"?> <A> <B> <C>stuff</C> <D>stuff1</D> <E>stuff2</E>
<?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>
您好,非常感谢,这很有效,但我刚刚注意到,在节点stuff3下,我应该得到stuff4和stuff5,而不是stuff1和stuff2。我想知道你是否看到了问题所在?好吧,这是错误的,你宁愿使用。同样的道理。另一方面,该模板中的整个代码在我看来有点复杂,我宁愿编写一个匹配B的模板,然后将模板应用于C,输出包装器元素ExtraInfo,并通过将模板应用于D和E来填充它:。我知道。我对这种东西只是一个新手,而且感觉很好。你有什么好的教程可以推荐吗?w3c有点基础,规则解释得不是很好。我想我必须投资买一本好书。一本书当然可以作为连贯的介绍和指导。另一方面,XSLT1.0已经有十多年的历史了,有一些常见问题解答网站,比如,XSL邮件列表的档案当然值得一读。