Помещение элемента в корневой узел после сопоставления с нижним узлом - PullRequest
0 голосов
/ 26 октября 2011

Я использовал некоторый код на форуме, чтобы обернуть несколько дочерних узлов в узле, но сейчас я изо всех сил пытаюсь получить заголовок в корневой узел.Вот пример 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>

Если я пытаюсь вставить шаблон для корневого узла, я получаю сообщение об ошибке, сообщающее, что у меня не может быть двух элементов более высокого уровня или некоторыхнапример.Как я могу вставить заголовок?

1 Ответ

0 голосов
/ 26 октября 2011

Добавить шаблон для элемента A, т.е.

<xsl:template match="A">
  <xsl:copy>
    <H>Heading</H>
    <xsl:apply-templates/>
  </xsl:copy>
</xsl:template>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...