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

时间:2011-10-26 09:23:17

标签: 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个更高级别的元素,或者其他一些元素。如何插入标题?

1 个答案:

答案 0 :(得分:0)

A元素添加模板,即

<xsl:template match="A">
  <xsl:copy>
    <H>Heading</H>
    <xsl:apply-templates/>
  </xsl:copy>
</xsl:template>