我想处理一个 161mo 的数据库,但是 java saxon9he 在 300mb 的 ram 和 .NET 在 1700mb ram 的内存不足,所以我需要使用流媒体,所以我使用 XMLSpy 演示,但我仍然不明白 xpath 表达式子父逻辑。我在 windows xp sp3 32bit 4gb 内存上。
<xsl:iterate select="db_entry">
<xsl:apply-templates select="db_entry"/>
</xsl:iterate>
使用 xsl:iterate 或 xsl:for-each 进行流式传输的正确方法是什么?该数据库中有近 60000 个条目。我的意思是如何正确编写这个,因为 db_entry 中的 db_entry 不起作用。
编辑:
<xsl:template match="databank_export">
<xsl:iterate select="db_entry">
<xsl:apply-templates select="public_data"/>
<xsl:text> |</xsl:text>
<xsl:apply-templates select="text_data"/>
<xsl:text> |</xsl:text>
<xsl:apply-templates select="research_data"/>
<xsl:text> </xsl:text>
</xsl:iterate>
</xsl:template>
我将 db_entry xsl:template 替换为 xsl:iterate 但随后 XMLspy 无法加载大文件,因此流式传输似乎不起作用。我做得对还是程序限制或演示限制?
第二次编辑:我将把我的整个 xsl 代码放在这里:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:fn="http://www.w3.org/2005/xpath-functions" xmlns:math="http://www.w3.org/2005/xpath-functions/math" xmlns:array="http://www.w3.org/2005/xpath-functions/array" xmlns:map="http://www.w3.org/2005/xpath-functions/map" xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns:err="http://www.w3.org/2005/xqt-errors" exclude-result-prefixes="array fn map math xhtml xs err" version="3.0">
<xsl:output method="text" encoding="UTF-8" indent="yes"/>
<xsl:mode streamable="yes"/>
<!--
<xsl:template match="databank_export">
-->
<xsl:template match="/">
<xsl:apply-templates select="databank_export/copy-of(db_entry)" mode="entry"/>
</xsl:template>
<xsl:template match="db_entry" mode="entry">
<xsl:value-of select="public_data, text_data, research_data" separator=" |"/>
<xsl:text> </xsl:text>
</xsl:template>
<xsl:template match="public_data">
<xsl:value-of select="sflname"/>
<xsl:text>; </xsl:text>
<xsl:apply-templates select="bdata"/>
<xsl:text>; </xsl:text>
<xsl:value-of select="gender"/>
<xsl:text>; PHOTO : |</xsl:text>
<xsl:value-of select="name, gender, rating, datatype/@sdatatype, datatype/@sdatasource, bdata/sbdate, bdata/sbdate/@ccalendar" separator=" - "/>
<xsl:text>|</xsl:text>
<xsl:value-of select="bdata/sbtime, bdata/sbtime/@sbtime_ampm, bdata/sbtime/@ctimetype, bdata/sbtime/@stimetype, bdata/sbtime/@stmerid, bdata/sbtime/@ctzauto, bdata/sbtime/@jd_ut, bdata/sbtime/@sznabbr, bdata/sbtime/@time_unknown, bdata/sbtime/@itimeaac, bdata/sbtime/@stimeaac" separator=" "/>
<xsl:text>|</xsl:text>
<xsl:value-of select="bdata/place, bdata/country, bdata/country/@sctr" separator=", "/>
<xsl:text>, </xsl:text>
<xsl:value-of select="bdata/place/@slati, bdata/place/@slong" separator=" "/>
<xsl:text>|</xsl:text>
<xsl:value-of select="scollector, seditor, biographer" separator=" "/>
<xsl:text>|</xsl:text>
<xsl:value-of select="screationdate, slasteditdate" separator=" "/>
</xsl:template>
<xsl:template match="bdata">
<xsl:value-of select="sbdate/@iday, sbdate/@imonth, sbdate/@iyear" separator="."/>
<xsl:text>; </xsl:text>
<xsl:value-of select="sbtime"/>
<xsl:text>; </xsl:text>
<xsl:analyze-string select="sbtime/@stmerid" regex="([hm]{{1}})([0-9]{{1,2}})([ew]{{1}})([0-9]{{0,2}})">
<xsl:matching-substring>
<xsl:choose>
<xsl:when test="regex-group(3) = 'e'">
<xsl:text>+</xsl:text>
</xsl:when>
<xsl:when test="regex-group(3) = 'w'">
<xsl:text>-</xsl:text>
</xsl:when>
<xsl:otherwise>
<xsl:text>+</xsl:text>
</xsl:otherwise>
</xsl:choose>
<xsl:choose>
<xsl:when test="regex-group(1) = 'h'">
<xsl:number value="regex-group(2)" format="01"/>
</xsl:when>
<xsl:when test="regex-group(1) = 'm'">
<xsl:text>00:</xsl:text>
<xsl:number value="regex-group(2)" format="01"/>
<xsl:text>:</xsl:text>
<xsl:number value="regex-group(4)" format="01"/>
</xsl:when>
<xsl:otherwise>
<xsl:text>+1</xsl:text>
</xsl:otherwise>
</xsl:choose>
</xsl:matching-substring>
</xsl:analyze-string>
<xsl:text>; </xsl:text>
<xsl:value-of select="place, country" separator=","/>
<xsl:text>; </xsl:text>
<xsl:value-of select="place/@slati, place/@slong" separator="; "/>
</xsl:template>
<xsl:template match="text_data">
<xsl:value-of select="shortbiography, wikipedia_link, db_link, sourcenotes" separator="|"/>
</xsl:template>
<xsl:template match="research_data">
<xsl:apply-templates select="categories"/>
<xsl:text>|</xsl:text>
<xsl:apply-templates select="relationships"/>
<xsl:text>|</xsl:text>
<xsl:value-of select="events/@count"/>
<xsl:text>|</xsl:text>
<xsl:apply-templates select="events"/>
</xsl:template>
<xsl:template match="categories">
<xsl:iterate select="category">
<xsl:value-of select="@cat_id, @db_id, @catnotes" separator=" "/>
<xsl:text> - </xsl:text>
<xsl:value-of select="text()"/>
<xsl:text> |</xsl:text>
</xsl:iterate>
</xsl:template>
<xsl:template match="relationships">
<xsl:iterate select="relationship">
<xsl:value-of select="@rel_id, @rel_db_id, @db_id, @relcat" separator=" "/>
<xsl:text> - </xsl:text>
<xsl:value-of select="@relnotes, text()" separator=" - "/>
<xsl:text> |</xsl:text>
</xsl:iterate>
</xsl:template>
<xsl:template match="events">
<xsl:iterate select="event">
<xsl:value-of select="@sevcode, @evn_id, @db_id, @evnotes" separator=" "/>
<xsl:text> |</xsl:text>
<xsl:apply-templates select="event_data"/>
<xsl:text> |</xsl:text>
</xsl:iterate>
</xsl:template>
<xsl:template match="event">
<xsl:apply-templates select="event_data"/>
</xsl:template>
<xsl:template match="event_data">
<xsl:value-of select="sbdate, sbdate/@ccalendar, sbdate_dmy" separator=" "/>
</xsl:template>
</xsl:stylesheet>
它适用于一个小样本文件,但不适用于整个 161mb 文件。
此致。