Могу ли я использовать XSLT для разбора XML на вложенные файлы? (+ Альтернативные языки / Методы)
Привет всем, у меня есть очень повторяющиеся данные с глубиной 5 узлов (включая корень), которые необходимо разбить на части. (Я включу быстрый пример через минуту.) Я собираюсь разобрать XML-файл размером ~ 5 Мб в меньшие вложенные файлы на основе узлов 3-й глубины. Но после этого все становится сложнее.
Требования задачи следующие:
- Подфайлы должны поддерживать иерархических родителей узла 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 несколько раз, это должно сработать.