Как разделить XML-файл на множество XML-файлов с помощью XSLT - PullRequest
10 голосов
/ 29 января 2011

Я хотел бы знать, как написать XSLT для разделения XML-файла на несколько XML-файлов в соответствии с этими требованиями:

  • file1.xml - озера, которые печатают = Natyral
  • file2.xml - Озера, которые печатают = Искусственные
  • file3.xml - озера, которые печатают = ледниковые

XML-файл импута:

<Lakes>
  <Lake>
    <id>1</id>
    <Name>Caspian</Name>
    <Type>Natyral</Type>
  </Lake>
  <Lake>
    <id>2</id>
    <Name>Moreo</Name>
    <Type>Glacial</Type>
  </Lake>
  <Lake>
    <id>3</id>
    <Name>Sina</Name>
    <Type>Artificial</Type>
  </Lake>
</Lakes>

Ответы [ 2 ]

19 голосов
/ 29 января 2011

Используйте XSLT 2.0, как эта таблица стилей:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="/">
        <xsl:for-each-group select="Lakes/Lake" group-by="Type">
            <xsl:result-document href="file{position()}.xml">
                <Lakes>
                    <xsl:copy-of select="current-group()"/>
                </Lakes>
            </xsl:result-document>
        </xsl:for-each-group>
    </xsl:template>
</xsl:stylesheet>

Примечание : xsl:result-document инструкция.

3 голосов
/ 29 января 2011

В стандартном XSL невозможно иметь более одного выходного xml (то есть результирующего дерева).
Однако, используя расширение Xalan redirect , вы можете.

Посмотрите пример на странице в ссылке.Я проверил следующее с Xalan Java 2.7.1

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" xmlns:redirect="http://xml.apache.org/xalan/redirect" extension-element-prefixes="redirect">

    <xsl:output method="xml" indent="yes" />

    <xsl:template match="/">
        <xsl:apply-templates />
    </xsl:template>

    <xsl:template match="/Lakes/Lake[Type='Natyral']">
        <redirect:write file="/home/me/file1.xml">
            <NatyralLakes>
                <xsl:copy-of select="." />
            </NatyralLakes>
        </redirect:write>
    </xsl:template>

    <xsl:template match="/Lakes/Lake[Type='Artificial']">
        <redirect:write file="/home/me/file1.xml">
            <ArtificialLakes>
                <xsl:copy-of select="." />
            </ArtificialLakes>
        </redirect:write>
    </xsl:template>

    <xsl:template match="/Lakes/Lake[Type='Glacial']">
        <redirect:write file="/home/me/file3.xml">
            <GlacialLakes>
                <xsl:copy-of select="." />
            </GlacialLakes>
        </redirect:write>
    </xsl:template>


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