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

Привет всем, у меня есть очень повторяющиеся данные с глубиной 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>

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

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

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

Edit:

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

<?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 ]

3 голосов
/ 09 мая 2009

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

/xml/major-group/minor-group    (the explicit way)
/*/*/*                          (the generic, any-third-level-element way)

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

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

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

0 голосов
/ 09 мая 2009

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...