2013-09-19 14 views
0

Это обратное отображение моего предыдущего question. Здесь я пытаюсь превратитьКак добавить дочерние элементы

<Information> 
<Element11/> 
<Element12/> 
<Element13/> 
</Information> 
<!-- This will be the child Element1 --> 
<Metadata> 
<Element11/> 
<Element12/> 
<Element13/> 
</Metadata> 
<Metadata> 
<Element11/> 
<Element12/> 
<Element13/> 
</Metadata> 

To:

<Element1> 
    <Element11/> 
    <Element12/> 
    <Element13/> 
    <Element1> 
    <Element11/> 
    <Element12/> 
    <Element13/> 
    </Element1> 
    <Element1> 
    <Element11/> 
    <Element12/> 
    <Element13/> 
    </Element1> 
</Element1> 

Я попытался с помощью or в корне, но это не сработало.

<xsl:for-each select="Information | Metadata"> 
<Element1> 
<!-- Rest of the elements --> 
    <xsl:for-each select="Metadata"> 
    <Element1> 
    <!-- Rest of the elements --> 
    </Element1> 
    </xsl:for-each> 
</Element1> 
</xsl:for-each> 

ответ

1

я не знаю смысл этого примера, но следующий код должен произвести желаемый результат ... но это не единственный возможный способ решить это :-D

<xsl:template match="Information"> 
    <Element1> 
    <xsl:for-each select="*"> 
     <xsl:copy> 
     <!-- if the elements contains values --> 
     <xsl:value-of select="."/> 
     </xsl:copy> 
    </xsl:for-each> 
    <xsl:for-each select="../Metadata"> 
     <Element1> 
     <xsl:for-each select="*"> 
      <xsl:copy> 
      <!-- if the elements contains values --> 
      <xsl:value-of select="."/> 
      </xsl:copy> 
     </xsl:for-each> 
     </Element1> 
    </xsl:for-each> 
    </Element1> 
</xsl:template> 
+0

Это называется рекурсивной привязкой. Спасибо. Я скоро проверю это. –

+0

Есть еще одно сомнение, поскольку я новичок в XSLT. Приведенный выше пример xml не имеет никакого значения. Но если у меня есть значение в элементе '', просто копирует элементы xml. Как я могу скопировать его со значениями? –

+0

@ Химаншу Ядав: Я модифицировал пример, чтобы скопировать также простое текстовое значение. Если есть вспомогательные элементы, это становится немного сложнее. Тогда «» - это способ его продолжения. Обычно вы можете выбирать между итерационным способом (например, пример выше) или декларативным способом с помощью шаблонов и xsl: apply-templates. – OkieOth

1

Другой очень похожий способ предполагает, что вход хорошо сформирован (обернут в некоторый элемент):

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
<xsl:template match="/SomeElement"> 
    <Element1> 
     <xsl:copy-of select="Information/*"/> 
     <xsl:for-each select="Metadata"> 
      <Element1> 
       <xsl:copy-of select="*"/> 
      </Element1> 
     </xsl:for-each> 
    </Element1> 
</xsl:template> 
</xsl:stylesheet> 
Смежные вопросы