2011-01-13 3 views
1

Я хотел бы разбить файл на несколько файлов на основе начальной буквы элемента. Например:Сплит XML-файл на основе первого символа строки

<Employees>  
<Employee id="1"> 
<firstname value="Atif"></firstname>   
<lastname value="Bashir"></lastname>   
<age >32</age>   
</Employee>  
<Employee id="2"> 
<firstname value="xyz"></firstname>   
<lastname value="abc"></lastname>   
<age >32</age>   
</Employee>  
<Employee id="3"> 
<firstname value="abc"></firstname>   
<lastname value="none"></lastname>   
<age >32</age>   
</Employee>  
</Employees> 

После применения преобразования, выше файл должен быть разделен на два файла, так как первый символ Сотрудника/FirstName [@value] (и все группы данных). Так выше случае первый файл должен быть:

a.xml

<Employees>  
<Employee id="1"> 
<firstname value="Atif"></firstname>   
<lastname value="Bashir"></lastname>   
<age >32</age>   
</Employee>  
<Employee id="3"> 
<firstname value="abc"></firstname>   
<lastname value="none"></lastname>   
<age >32</age>   
</Employee>  
</Employees> 

и второй файл должен быть:

x.xml

<Employees>  
<Employee id="2"> 
<firstname value="xyz"></firstname>   
<lastname value="abc"></lastname>   
<age >32</age>   
</Employee>  
</Employees>  

Что такое код XSLT для выполнить это преобразование?

Спасибо!

ответ

3

С XSLT 2.0:

<xsl:for-each-group select="Employee" 
        group-by="lower-case(substring(firstname,1,1))"> 
    <xsl:result-document href="{current-grouping-key()}.xml"> 
    <xsl:copy-of select="current-group()"/> 
    </xsl:result-document> 
</xsl:for-each-group> 
+0

+1 Отлично доктор Кей. Я добавил небольшое формирование, чтобы оно не прокручивалось ... –

+0

Спасибо, Майкл. – atif

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