2017-02-08 10 views
1

У меня проблема с XSLT Преобразование большого набора данных (60 ГБ/50000 цилиндра на хост). Программа работает на мэйнфрейме, поэтому я не получаю 2 ГБ Headsize, в которой он нуждается. Но я не понимаю, зачем ему нужно столько места, может быть, есть способ сделать преобразование с меньшим пространством? Я ничего не знаю о XSLT, мне нужна половина и день, чтобы сделать это ^^XSLT преобразует большой xml-файл с меньшей памятью

Моя проблема: В XML много XML-тегов мне не нужно (в примере person_id, Iso_laender_code), i хочу фильтровать, поэтому я получаю только тех, кому мне нужно.

Моего XML: У меня есть много метких лица:

<ndm_message><message> 
    <Person>...</Person> 
    <Person>...</Person> 
    <Person>...</Person>... 

Каждый человек имеет метки, такие как имя, Адрес ... и многие-тег не нужен

<Person> 
     <person_id>24</person_id> 
     <name>Person's Name</name> 
     </titel> 
     <Adresse> 
       <strasse>Irgendwo</strasse> 
       <iso_laender_code>004</iso_laender_code> 
     </Adresse> 
</Person 

Моего XSLT : я определил Whitelist и проверять-каждое лицо любого узла против Белого списка:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
<xsl:output method="xml" omit-xml-declaration="yes" indent="yes"/> 
<xsl:strip-space elements="*"/> 

<xsi:WhiteList> 
    <name>Person</name> 
    <name>name</name> 
    <name>Adresse</name> 
    <name>strasse</name> 
</xsi:WhiteList> 

<xsl:template match="/"> 
    <ndm_message> 
    <xsl:for-each select="ndm_message/message/Person"> 

      <xsl:call-template name="filter" > 
       <xsl:with-param name="Knoten" select="."/> 
      </xsl:call-template> 

    </xsl:for-each> 
    </ndm_message> 
</xsl:template> 

<xsl:template name="filter"> 
    <xsl:param name="Knoten" /> 
    <xsl:if test="$Knoten[name()=document('')/*/xsi:WhiteList/*]"> 

    <xsl:copy> 
     <xsl:if test="not(child::*)"> 
     <xsl:value-of select="$Knoten"/> 
     </xsl:if> 
     <xsl:for-each select="$Knoten/*"> 
     <xsl:call-template name="filter" > 
      <xsl:with-param name="Knoten" select="."/> 
     </xsl:call-template> 
     </xsl:for-each> 
     <!-- --> 
    </xsl:copy> 
    </xsl:if> 
</xsl:template> 

Я запускаю XSLT на Java с помощью saxon9.jar.

public static void simpleTransform(String sourcePath, String xsltPath, 
            String resultDir) { 
    System.setProperty("javax.xml.transform.TransformerFactory", 
      "net.sf.saxon.TransformerFactoryImpl"); 
    TransformerFactory tFactory = TransformerFactory.newInstance(); 
    try { 
     Transformer transformer = 
      tFactory.newTransformer(new StreamSource(new File(xsltPath))); 

     transformer.transform(new StreamSource(new File(sourcePath)), 
           new StreamResult(new File(resultDir))); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

Кто-нибудь знает, зачем ему нужно столько места? Я думаю, что XSLT ссылается только на одного человека, а теги рекурсивны, один/Person - около 32 КБ. Возможно, проблема - это StreamSource и результат? Есть ли другой способ сделать это с помощью XSLT и меньше места?

Большое спасибо Флориан

+0

Saxon 9 EE может позволить вам запускать таблицу стилей XSLT 3.0 с использованием потоковой передачи, где процессор XSLT, в отличие от обычной модели обработки XSLT для построения дерева полного входа XML, передает через вход в режиме только вперед. Однако для этого требуется лицензия на Saxon EE и переписывание XSLT, чтобы разрешить такую ​​обработку. –

ответ

1

Вот XSLT 3.0 таблицы стилей, которые можно использовать с Saxon 9 EE сделать streaming processing вашего ввода:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    xmlns:math="http://www.w3.org/2005/xpath-functions/math" 
    exclude-result-prefixes="xs math" 
    version="3.0"> 

    <xsl:param name="STREAMABLE" static="yes" as="xs:boolean" select="true()"/> 

    <xsl:mode _streamable="{$STREAMABLE}" on-no-match="shallow-copy"/> 

    <xsl:output indent="yes"/> 
    <xsl:strip-space elements="*"/> 

    <xsl:param name="white-list"> 
     <name>Person</name> 
     <name>name</name> 
     <name>Adresse</name> 
     <name>strasse</name> 
    </xsl:param> 

    <xsl:template match="ndm_message"> 
     <xsl:copy> 
      <xsl:apply-templates select="message/Person"/> 
     </xsl:copy> 
    </xsl:template> 

    <xsl:template match="Person//*[not(local-name() = $white-list/name)]"/> 

</xsl:stylesheet> 

Он преобразует входную выборку

<ndm_message> 
    <message> 
     <Person> 
      <person_id>24</person_id> 
      <name>Person 24</name> 
      <titel>Ein Titel</titel> 
      <Adresse> 
       <strasse>Strasse 24</strasse> 
       <iso_laender_code>004</iso_laender_code> 
      </Adresse> 
     </Person> 
     <Person> 
      <person_id>25</person_id> 
      <name>Person 25</name> 
      <titel>Ein Titel</titel> 
      <Adresse> 
       <strasse>Strasse 25</strasse> 
       <iso_laender_code>004</iso_laender_code> 
      </Adresse> 
     </Person> 
    </message> 
</ndm_message> 

в выходной образец

<ndm_message> 
    <Person> 
     <name>Person 24</name> 
     <Adresse> 
     <strasse>Strasse 24</strasse> 
     </Adresse> 
    </Person> 
    <Person> 
     <name>Person 25</name> 
     <Adresse> 
     <strasse>Strasse 25</strasse> 
     </Adresse> 
    </Person> 
</ndm_message> 

Что касается работы с Java, я считаю, что использовать XSLT 3.0 и потоковое использование лучше (или даже необходимо, см. https://saxonica.plan.io/issues/3120) использовать саксонский специфический API http://saxonica.com/html/documentation/using-xsl/embedding/s9api-transformation.html вместо JAXP.

0

Спасибо за ваши решения, но звук XSLT Streaming затруднен, я обычно программировал COBOL ^^ Я решил написать Java-программу с помощью анализатора Stax и проверить XML-тег против «белого списка» в файле. Это было проще для меня, и я могу читать в UTF-8 и писать в EBCDIC, поэтому я сохранил конверсионный шаг в моем JCL :-) Но спасибо вам большое за помощь.

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

  • Нет связанных вопросов^_^