Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xml 匹配下层节点后将元素放入根节点_Xml_Xslt - Fatal编程技术网

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示例:

<?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邮件列表的档案当然值得一读。