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