2015-01-09 5 views
-3

XML Input:Транслирующие XML Узлы с порядка

<a> 
    <b>text_b</b> 
    <d>text_d</d> 
    <c>text_c</c> 
    <e>text_e</e> 
    <d>text_d</d> 
    <f>text_f</f> 
</a> 
<g> 
    <b>text_b</b> 
    <d>text_d</d> 
    <c>text_c</c> 
    <e>text_e</e> 
    <d>text_d</d> 
    <f>text_f</f> 
</g> 

Желаемая Выход:

<aa> 
    <aaa> 
     <some_extra_tag>some_text</some_extra_tag> 
     <aab>text_b</aab> 
    </aaa> 
    <aad>text_d</aad> 
    <aaa> 
     <some_extra_tag>some_text</some_extra_tag> 
     <aac>text_c</aac> 
     <aae>text_e</aae> 
    </aaa> 
    <aad>text_d</aad> 
    <aaa> 
     <some_extra_tag>some_text</some_extra_tag> 
     <aaf>text_f</aaf> 
    </aaa> 
</aa> 
<gg> 
    <aab>text_b</aab> 
    <ggg> 
     <some_extra_tag2>some_text</some_extra_tag2> 
     <aad>text_d</aad> 
    </ggg> 
    <aac>text_c</aac> 
    <aae>text_e</aae> 
    <ggg> 
     <some_extra_tag2>some_text</some_extra_tag2> 
     <aad>text_d</aad> 
    </ggg> 
    <aaf>text_f</aaf> 
</gg> 

Могу ли я использовать XSLT для перевода выше XML вход на желаемый результат? Ограничения: some_extra_tag-Tag должен быть сгенерирован шаблоном-тегом-тегом и some_extra_tag2-тегом по шаблону g-Tag-Template.

+0

Так вы говорите, вы хотите поместить каждый ' inner' и 'middle' в своем собственном элементе' outer', и помещаем 'inner's' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' ' Вы действительно не объяснили, что хотите. – JLRishe

+0

что я хочу сделать, это просто сохранить порядок, как было, Я знаю, если я использую порядок будет сохранен, однако я не могу этого сделать потому что на внешнем шаблоне создается . На самом деле, не имеет значения, имеет ли средний тэг свой собственный внешний тег. Для уточнения, у меня есть editer мой вопрос. – sstephen

+0

Ваш вопрос (еще) непонятен. Пример неоднозначен - каковы ** правила ** для преобразования? –

ответ

0

XSLT

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
     xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl"> 
     <xsl:output method="xml" indent="yes"/> 

     <xsl:template match="outer"> 
     <doc> 
      <xsl:apply-templates select="*" /> 
     </doc> 
     </xsl:template> 


     <xsl:template match="*"> 
     <outer> 
      <span> 
      <xsl:copy-of select="."/> 
      </span> 
     </outer> 
     </xsl:template> 

    </xsl:stylesheet> 

Выход:

<?xml version="1.0" encoding="utf-8"?> 
<doc> 
    <outer> 
    <span> 
     <inner>text first</inner> 
    </span> 
    </outer> 
    <outer> 
    <span> 
     <middle>text second</middle> 
    </span> 
    </outer> 
    <outer> 
    <span> 
     <inner>text third</inner> 
    </span> 
    </outer> 
</doc> 
+0

Ваш выход не соответствует ни текущему запрошенному результату, ни исходному запрошенному выводу. – JLRishe

+0

Почему? что не так с моим выходом? Добавлен тег Doc для XML, который должен быть действительным –

2

Что (я думаю) вы пытаетесь сделать, это немного сложнее, но я считаю, что следующий должен сделать это. Она работает с помощью рекурсивного шаблона:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" indent="yes"/> 

    <!-- standard identity template --> 
    <xsl:template match="node() | @*" name="Copy"> 
    <xsl:copy> 
     <xsl:apply-templates select="node() | @*" /> 
    </xsl:copy> 
    </xsl:template> 

    <xsl:template match="outer"> 
    <xsl:copy> 
     <xsl:apply-templates select="*[not(self::inner)] | 
            inner[not(preceding-sibling::*[1][self::inner])]" /> 
    </xsl:copy> 
    </xsl:template> 

    <xsl:template match="inner[not(preceding-sibling::*[1][self::inner])]"> 
    <span> 
     <xsl:call-template name="Copy" /> 
     <xsl:apply-templates select="following-sibling::*[1][self::inner]" /> 
    </span> 
    </xsl:template> 

    <xsl:template match="inner"> 
    <xsl:call-template name="Copy" /> 
    <xsl:apply-templates select="following-sibling::*[1][self::inner]" /> 
    </xsl:template> 

</xsl:stylesheet> 

При запуске на этом входе:

<outer> 
    <inner>text first</inner> 
    <inner>text second</inner> 
    <middle>text third</middle> 
    <inner>text fourth</inner> 
</outer> 

Он производит результат:

<outer> 
    <span> 
    <inner>text first</inner> 
    <inner>text second</inner> 
    </span> 
    <middle>text third</middle> 
    <span> 
    <inner>text fourth</inner> 
    </span> 
</outer> 
+0

Подождите, кажется, есть некоторая ошибка, я упомянул, что span-Tag необходимо сгенерировать на внешнем теге правильно? – sstephen

+0

@sstephen Мой XSLT производит вывод, который вы указали в разделе «желаемый результат». Если ваш желаемый результат - это что-то еще, уточните это и выполните свое требование. – JLRishe

+0

Да, он производит правильный вывод, однако он пренебрегает моим требованием (я отредактировал мой вопрос) – sstephen

Смежные вопросы