我有以下 XML 结构
<?xml version="1.0" encoding="UTF-8"?>
<ExportData>
<TransportHeader>
<Timestamp>2011-01-16 06:00:33</Timestamp>
<From>
<Name>DynamicExport</Name>
<Version>1.</Version>
</From>
<MessageId>d7b5c5b69a83</MessageId>
</TransportHeader>
<ExportConfig>
<DateTimeFormat>yyyy-MM-dd HH:mm:ss</DateTimeFormat>
<DecimalSymbol>.</DecimalSymbol>
</ExportConfig>
<DataSet>
<Tables>
<Table>
<RH>...</RH>
<Rows>
<R>Data1</R>
<R>Data2</R>
<R>Data3</R>
<R>Data4</R>
<R>Data5</R>
</Rows>
</Table>
</Tables>
</DataSet>
</ExportData>
我需要根据<R>
元素的数量拆分文件。如果元素超过 3个,则<R>
需要生成第二个输出文件。这两个文件还需要标题信息。
我想出了这个 XSLT:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xd="http://www.oxygenxml.com/ns/doc/xsl"
xmlns:redirect="http://xml.apache.org/xalan/redirect"
extension-element-prefixes="redirect"
exclude-result-prefixes="xd"
version="1.0">
<xsl:template match="/">
<xsl:apply-templates/>
</xsl:template>
<xsl:template match="text() | @*"/>
<xsl:template match="Rows" name="Rows">
<Rows>
<xsl:for-each select="R">
<xsl:variable name="filename1" select="concat('output1','.xml')"/>
<xsl:variable name="filename2" select="concat('output2','.xml')"/>
<xsl:variable name="nodePosition" select="position()" />
<xsl:if test="$nodePosition < 3">
<redirect:write select="$filename1">
<xsl:copy-of select="." />
</redirect:write>
</xsl:if>
<xsl:if test="$nodePosition = 3 or $nodePosition > 3">
<redirect:write select="$filename2">
<xsl:copy-of select="." />
</redirect:write>
</xsl:if>
</xsl:for-each>
</Rows>
</xsl:template>
</xsl:stylesheet>
但是生成的两个输出文件只包含“Data2”和“Data5”。您能帮我弄清楚为什么缺少其他 3 个数据元素吗?以及如何添加标题数据?
对于标题,我想出了这个 XSLT:
<xsl:template match="//Rows">
<xsl:apply-templates select="@*|Rows"/>
</xsl:template>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
当我将它应用于提到的 XML 时,它会起作用。但我无法将这 2 个 XSLT 组合起来——输出只是被弄乱了。