2016-02-06 1 views
0

Я пытаюсь изучить xslt как хобби, и один из вариантов использования, который мне интересен, заключается в расширении определений определенных компонентов до их полных форм. Пример должен прояснить, что я имею в виду. например если мой ввод XML выглядит следующим образом:Развернуть компактное представление xml для более подробного представления с помощью xslt

<universe> 
    <galaxies> 
     <galaxy name="milky way"> 
      <system name="solar system"/> 
     </galaxy> 
     <galaxy name="lactose free"> 
      <system name="windmill system"/> 
     </galaxy> 
     <galaxy name="parallelish solar system"> 
      <system name="the earth system"/> 
     </galaxy> 
    </galaxies> 
    <systems> 
     <system name="solar system"> 
      <planet name="pluto"/> 
      <system name="the earth system"/> 
      <planet name="mercury"/> 
     </system> 
     <system name="windmill system"> 
      <planet name="windy"/> 
     </system> 
     <system name="the earth system"> 
      <planet name="earth"/> 
      <satellite name="moon"/> 
     </system> 
    </systems> 
</universe> 

Моего выход XML будет иметь эти системы определения расширенное в определениях галактик рекурсивно (например, система заземления в Солнечной системе), и в каждом отдельном месте происходит определение (например, земли система происходит в двух разных системах). В разделе системы будут удалены:

<universe> 
    <galaxies> 
     <galaxy name="milky way"> 
      <system name="solar system"> 
       <planet name="pluto"/> 
       <system name="the earth system"> 
        <planet name="earth"/> 
        <satellite name="moon"/> 
       </system> 
       <planet name="mercury"/> 
      </system> 
     </galaxy> 
     <galaxy name="lactose free"> 
      <system name="windmill system"> 
       <planet name="windy"/> 
      </system> 
     </galaxy> 
     <galaxy name="parallelish solar system"> 
      <system name="the earth system"> 
       <planet name="earth"/> 
       <satellite name="moon"/> 
      </system> 
     </galaxy> 
    </galaxies> 
</universe> 

Я довольно много нового XSLT, и в настоящее время, линия мысли я следовал в том, чтобы каким-то образом определить эти составные блоки, как переменные и вставить их по мере необходимости на втором (втором) проходе. Однако, поскольку я искал googled и немного читал, пытаясь найти примеры, я не был очень успешным. Мне интересно, возможно ли это (я бы так ожидал), и какие понятия мне нужно использовать для достижения этого. Примеры фрагментов будут очень полезными.

Спасибо!

ответ

0

XSLT имеет очень полезный механизм для разрешения перекрестных ссылок. Чтобы продемонстрировать, как она могла бы работать, я первым Изменив пример XML, чтобы избежать циклических ссылок:

XML

<universe> 
    <galaxies> 
     <galaxy name="milky way"> 
      <system-ref name="solar system"/> 
     </galaxy> 
     <galaxy name="lactose free"> 
      <system-ref name="windmill system"/> 
     </galaxy> 
     <galaxy name="parallelish solar system"> 
      <system-ref name="the earth system"/> 
     </galaxy> 
    </galaxies> 
    <systems> 
     <system name="solar system"> 
      <planet name="pluto"/> 
      <system-ref name="the earth system"/> 
      <planet name="mercury"/> 
     </system> 
     <system name="windmill system"> 
      <planet name="windy"/> 
     </system> 
     <system name="the earth system"> 
      <planet name="earth"/> 
      <satellite name="moon"/> 
     </system> 
    </systems> 
</universe> 

XSLT

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 
<xsl:strip-space elements="*"/> 

<xsl:key name="system-by-name" match="system" use="@name" /> 

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

<xsl:template match="system-ref"> 
    <xsl:apply-templates select="key('system-by-name', @name)"/> 
</xsl:template> 

<xsl:template match="systems"/> 

</xsl:stylesheet> 

Результат

<?xml version="1.0" encoding="UTF-8"?> 
<universe> 
    <galaxies> 
     <galaxy name="milky way"> 
     <system name="solar system"> 
      <planet name="pluto"/> 
      <system name="the earth system"> 
       <planet name="earth"/> 
       <satellite name="moon"/> 
      </system> 
      <planet name="mercury"/> 
     </system> 
     </galaxy> 
     <galaxy name="lactose free"> 
     <system name="windmill system"> 
      <planet name="windy"/> 
     </system> 
     </galaxy> 
     <galaxy name="parallelish solar system"> 
     <system name="the earth system"> 
      <planet name="earth"/> 
      <satellite name="moon"/> 
     </system> 
     </galaxy> 
    </galaxies> 
</universe> 
+0

Спасибо за помощь Майкл! Сейчас я начинаю читать о ключах, спасибо, что указал на них. –

+0

Я также обнаружил, что для моего конкретного случая кажется более естественным отличать системы/систему (определение) от ссылок на систему неявно, используя исходный xml, который я опубликовал, и следующий более подходящий шаблон: Я делаю есть также чтение и исключение матчей (например, нет (система/системы)). –

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

  • Нет связанных вопросов^_^