Привет всем, у меня есть очень повторяющиеся данные с глубиной 5 узлов (включая корень), которые нужно разбить. (Я включу быстрый пример за минуту.) Я хочу, чтобы это проанализировать XML-файл размером 5 МБ в более мелкие подфайлы на основе узлов третьей глубины. Но после этого все усложняется.Могу ли я использовать XSLT для разбора XML в подфайлы? (+ Альтернативные языки/методы)
требование Задачи является следующим:
- Суб-файлы должны поддерживать иерархические родитель узла 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>
Ваш XSLT можно существенно улучшить. Я бы показал вам, но я не уверен, что вы вообще можете использовать XSLT 1.0 - я думал, что вам нужны несколько выходных файлов? – Tomalak
Ну, XML - v1, а XSLT - 2.0; Я запускаю его через интерфейс Saxon .NET. Он выводит мои файлы по мере необходимости. –