2016-07-19 4 views
1

У меня есть неструктурированный XML, который нужно преобразовать в структурированный. Я получаю это от научных pdf-файлов, обрабатываемых apache tika и преобразованных в xml Parscit. XML выглядит следующим образом:Преобразование неструктурированного xml в структурированный

ВХОД:

<algorithm> 
    <sectionHeader> Section1 </sectionHeader> 
    <BodyText>Text goes here</BodyText> 
    <sectionHeader> Section2 </sectionHeader> 
    <BodyText>Text goes here</BodyText> 
    <subsectionHeader>Subsection</subsectionHeader> 
    <BodyText>Text goes here</BodyText> 
    <sectionHeader> Section1 </sectionHeader> 
    <BodyText>Text goes here</BodyText> 
</algorithm> 

ВЫВОД:

<algorithm> 
    <sectionHeader> 
     <Text> Section1 </Text> 
     <BodyText>Text goes here</BodyText> 
    </sectionHeader> 
    <sectionHeader> 
     <Text> Section2 </Text> 
     <BodyText>Text goes here</BodyText> 
    <subsectionHeader> 
     <Text>Subsection</Text> 
     <BodyText>Text goes here</BodyText> 
    </subsectionHeader> 
</sectionHeader> 
<sectionHeader> 
    <text>Section3 </Text> 
    <BodyText>Text goes here</BodyText> 
</sectionHeader> 
</algorithm> 

Я могу сделать это с помощью строки построитель и XPath в Java. Но это влияет на производительность, поскольку мне, возможно, придется обрабатывать миллионы документов. То есть xslt лучший подход?

+0

Что такое ваше определение "лучше"? Можете ли вы сделать то же самое с помощью xslt? Это более или менее читаемо? Это быстрее или нет на вашем входе? Только вы можете попробовать найти ответы на эти вопросы. – Fildor

+0

Почему ' Раздел 2 Текст идет здесь' в результате не будет помечено как ' Раздел 2 Текст идет здесь'? Должен ли он даже обернуть следующее подразделение Header? –

+0

Упс! Виноват. Изменили его. – Yauza

ответ

1

Вы могли бы сделать это следующим образом:

XSLT 2,0

<xsl:stylesheet version="2.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="xml" version="1.0" encoding="utf-8" indent="yes"/> 

<xsl:template match="/algorithm"> 
    <xsl:copy> 
     <xsl:for-each-group select="*" group-starting-with="sectionHeader"> 
      <sectionHeader> 
       <Text> 
        <xsl:value-of select="." /> 
       </Text> 
       <xsl:for-each-group select="current-group()" group-starting-with="subsectionHeader"> 
        <xsl:choose> 
         <xsl:when test="self::subsectionHeader"> 
          <subsectionHeader> 
           <Text> 
            <xsl:value-of select="." /> 
           </Text> 
           <xsl:copy-of select="current-group()[not(self::subsectionHeader)]"/> 
          </subsectionHeader> 
         </xsl:when> 
         <xsl:otherwise> 
          <xsl:copy-of select="current-group()[not(self::sectionHeader)]"/> 
         </xsl:otherwise> 
        </xsl:choose> 
       </xsl:for-each-group> 
      </sectionHeader> 
     </xsl:for-each-group> 
    </xsl:copy> 
</xsl:template> 

</xsl:stylesheet> 
Смежные вопросы