我们正在使用 Saxon EE 12.x 将大型(多 GB)XML 文件转换为更小的内部 XML 结构。我们希望减少内存消耗,并且每个<Document>
节点上的突发流似乎与我们的应用程序完美匹配。它有效 - 但我们在一些看似简单的构造上遇到了困难:如何获取像<PrintDate>
分支这样的信息并将其作为流模式中的属性<ExportHeader>
添加到每个输出元素?<Doc>
源 XML 包含 1000 个<Document>
-node,每个<Document>
-node 包含 1000 行 XML,<ExportHeader>
-node 非常小,仅包含一些元信息。简化的示例源 XML 如下所示:
<Export>
<ExportHeader>
<PrintDate>2024-12-24</PrintDate>
</ExportHeader>
<ExportContent>
<Document>
<LotsOfXml></LotsOfXml>
</Document>
<Document>
<LotsOfXml></LotsOfXml>
</Document>
<Document>
<LotsOfXml></LotsOfXml>
</Document>
</ExportContent>
</Export>
我们的目标 XML 应该是这样的:
<Exp>
<Doc PrintDate="???">
<LotsOfTransformedXML></LotsOfTransformedXML>
</Doc>
<Doc PrintDate="???">
<LotsOfTransformedXML></LotsOfTransformedXML>
</Doc>
<Doc PrintDate="???">
<LotsOfTransformedXML></LotsOfTransformedXML>
</Doc>
</Exp>
一个非常简单的 XSLT 看起来像这样,但是我们不知道如何在不破坏流动性的情况下将其<PrintDate>
放入<Doc>
-node 属性... 是否可以<xsl:accumulator>
使用来存储/获取值,如果可以,如何使用?
<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:mode streamable="yes" on-no-match="shallow-skip"/>
<xsl:mode name="insideDoc" streamable="no" on-no-match="shallow-copy "/>
<xsl:template match="Export">
<xsl:element name="Exp">
<xsl:apply-templates></xsl:apply-templates>
</xsl:element>
</xsl:template>
<xsl:template match="PrintDate">
<!-- how to keep/store this PrintDate, so we can add it to the Doc elements as an attribute later... -->
</xsl:template>
<xsl:template match="ExportContent">
<xsl:apply-templates select="copy-of(Document)" mode="insideDoc"/>
</xsl:template>
<xsl:template match="Document" mode="insideDoc">
<xsl:element name="Doc">
<xsl:attribute name="PrintDate" select="'???'"/>
<xsl:apply-templates select="*" mode="insideDoc"/>
</xsl:element>
</xsl:template>
<xsl:template match="LotsOfXml" mode="insideDoc">
<xsl:element name="LotsOfTransformedXML">
</xsl:element>
</xsl:template>
</xsl:stylesheet>
使用捕获累加器https://www.saxonica.com/html/documentation12/extensions/attributes/capture.html例如
宣布
xmlns:saxon="http://saxon.sf.net/"
。 ...