2009-05-08 1 views
1

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

требование Задачи является следующим:

  1. Суб-файлы должны поддерживать иерархические родитель узла 3-го уровня, который извлекается, в том числе и их атрибутов.
  2. Суб-файлы должны сохранять все атрибуты и дочерние узлы.
  3. Если XSLT не может справиться с заданием, попробуйте его в Ruby. Если вы плохо разбираетесь в XSLT, но можете сказать мне, как это сделать в Ruby или даже Python, пожалуйста, не стесняйтесь давать ответ на этих языках. (Else попробовать и придерживаться 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 задача. :>

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> 
+0

Ваш XSLT можно существенно улучшить. Я бы показал вам, но я не уверен, что вы вообще можете использовать XSLT 1.0 - я думал, что вам нужны несколько выходных файлов? – Tomalak

+0

Ну, XML - v1, а XSLT - 2.0; Я запускаю его через интерфейс Saxon .NET. Он выводит мои файлы по мере необходимости. –

ответ

3

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

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

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

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

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

+0

Большое спасибо за отзыв о XSLT 2.0; это должно решить мою проблему, но я собираюсь проверить ее в первую очередь. –

0

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

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

+0

Раньше это было возможно с помощью Xalan Apache, http://www.abbeyworkshop.com/howto/xslt/xslt_split/index.html, но оно кажется несуществующим. Я не нашел другого связанного с ним результата через Google. :/(Кроме того, это разбиение - это то, что я пытаюсь сделать с Ruby или XSLT - я просто не знаю, как сохранить все это с Ruby.) –

+0

@Flea: этот пример ссылается на расширение перенаправления на Xalan , Похоже, что он доступен для Xalan-J (Java-версия Xalan), см. Http://xml.apache.org/xalan-j/extensionslib.html#redirect –

+0

Который я не знаю, как получить/использовать. Я никогда не касался Java. Я посмотрю на это ....:/ –

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