Могу ли я использовать XSLT для разбора XML на вложенные файлы? (+ Альтернативные языки / Методы)

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

Требования задачи следующие:

  1. Подфайлы должны поддерживать иерархических родителей узла 3-го уровня, который извлекается, включая их атрибуты.
  2. Подфайлы должны сохранять все атрибуты и дочерние узлы.
  3. Если XSLT не может справиться с заданием, попробуйте в Ruby. Если вы плохо разбираетесь в XSLT, но можете рассказать мне, как это сделать на Ruby или даже на Python, пожалуйста, не стесняйтесь дать ответ на этих языках. (В противном случае попробуйте использовать XSLT или псевдокод.)

DOM иерархия:

<xml attr="whatever">
  <major-group name="whatever">
    <minor-group name="whatever">
      <another-group name="whatever">
        <last-node name="whatever"></last-node>
      </another-group>
    </minor-group>
  </major-group>
</xml>

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

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

Мне любопытно посмотреть, подходит ли XSLT к этой задаче. :>

Редактировать:

Вот мой полученный код с возможностью показа таблицы стилей в начале файла.

<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
  <xsl:output method="xml"/>
  <xsl:template match="minor-group">
    <xsl:variable name="filename"><xsl:value-of select="concat(@name,'.xml')"/></xsl:variable>
    <xsl:result-document href="{$filename}">
      <xsl:text disable-output-escaping="yes">
        <![CDATA[<?xml-stylesheet type="text/xsl" href="../web.xslt"?>]]>
      </xsl:text> 
      <xml>
        <xsl:attribute name="whatever"><xsl:value-of select="../../@whatever" /></xsl:attribute>
        <major-group>
          <xsl:attribute name="whatever"><xsl:value-of select="../@whatever" /></xsl:attribute>
          <xsl:copy-of select="."/>
        </major-group>
      </xml>
    </xsl:result-document>
  </xsl:template>
</xsl:stylesheet>

2 ответа

Решение

Чтобы извлечь список элементов "второстепенной группы", потребуется одно из следующих выражений XPath.

/ xml / major-group / minor-group (явный способ)
/*/*/*                          (общий способ, любой элемент третьего уровня)

На любом языке сценариев прочитайте документ в DOM, создайте цикл над запросом XPath, записывая результаты в разные выходные файлы.

С XSLT 1.0 невозможно создать более одного выходного документа одновременно. Однако XSLT 2.0 поддерживает это через <xsl:result-document> инструкция

Если у вас есть движок XSLT 2.0, вы можете попробовать этот путь. На случайной странице, которую я нашел на веб-сайте IBM developerWorks, показано, как начать работу: Совет. Создайте несколько файлов в XSLT 2.0.

Я не верю, что вы можете разобрать один файл в несколько выходных файлов, используя просто XSLT.

Если вы хотите разбить XML на различные XML-файлы с помощью Ruby, а затем применить отдельные XML-файлы к XSLT несколько раз, это должно сработать.

Другие вопросы по тегам