У меня проблема с 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 и меньше места?
Большое спасибо Флориан
Saxon 9 EE может позволить вам запускать таблицу стилей XSLT 3.0 с использованием потоковой передачи, где процессор XSLT, в отличие от обычной модели обработки XSLT для построения дерева полного входа XML, передает через вход в режиме только вперед. Однако для этого требуется лицензия на Saxon EE и переписывание XSLT, чтобы разрешить такую обработку. –