匹配下节点后将元素放入根节点

  • 本文关键字:元素 根节点 节点 xml xslt
  • 更新时间 :
  • 英文 :


我在论坛中使用了一些代码来包装节点内的一些子节点,但现在我正在努力获得一个标题到根节点。下面是我要转换的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>

最新更新