我有来自csv文件的这两行
<ROOT>
1,M,40,0,5,0,Personeelsvoorschot,0
2,M,40,0,6,0,Personeelsvoorschot,0
</ROOT>在XSLT代码中,我获取标记中的每个单元格,如下所示(行号、哑元1等),但是当我尝试放置任何具有空值的单元格并进行测试时,出现了这个问题,标记没有获取空值,它获取的下一个单元格值是错误的,我将非常感谢您的帮助
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:exsl="http://exslt.org/common"extension-element-prefixes="exsl">
<xsl:output method="xml" encoding="UTF-8" indent="no" byte-order-mark="no"/>
<xsl:strip-space elements="*"/>
<!--<xsl:preserve-space elements="*"/>-->
<xsl:template match="@*|node()">
<xsl:copy >
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:key name="k1" match="row" use="cell[0]"/>
<xsl:key name="k2" match="row" use="concat(cell[1], '|', cell[3])"/>
<xsl:template match="/">
<xsl:element name="ProcessSalaryJournals">
<xsl:variable name="rows">
<xsl:call-template name="tokenize">
<xsl:with-param name="text" select="ProcessADPMultilinkSalaryJournalUpload/DataArea/ADPMultilinkSalaryJournalUpload/ADPMultilinkSalaryJournalUploaddocument/ROOT"/>
</xsl:call-template>
</xsl:variable>
<xsl:variable name="data">
<xsl:for-each select="exsl:node-set($rows)/row[position() > 0]">
<row>
<xsl:call-template name="tokenize">
<xsl:with-param name="text" select="."/>
<xsl:with-param name="delimiter" select="','"/>
<xsl:with-param name="name" select="'cell'"/>
</xsl:call-template>
</row>
</xsl:for-each>
</xsl:variable>
<!-- output -->
<SalaryJournals>
<xsl:for-each select="exsl:node-set($data)/row[count(. | key('k1', cell[1])[1]) = 1]">
<SalaryJournal>
<LineNumber>
<xsl:value-of select="cell[1]"/>
</LineNumber>
<Dummy1>
<xsl:value-of select="cell[2] " />
</Dummy1>
<Dummy2>
<xsl:value-of select="cell[3] " />
</Dummy2>
<Dummy3>
<xsl:value-of select="cell[4] " />
</Dummy3>
<Dummy4>
<xsl:value-of select="cell[5] " />
</Dummy4>
<Dummy5>
<xsl:value-of select="cell[6] " />
</Dummy5>
<VoucherText>
<xsl:value-of select="cell[7] " />
</VoucherText>
<AccountingDate>
<xsl:value-of select="cell[8] " />
</AccountingDate>
</SalaryJournal>
</xsl:for-each>
</SalaryJournals>
</xsl:element>
<xsl:apply-templates select="@*|node()"/>
</xsl:template>
<xsl:template name="tokenize">
<xsl:param name="text"/>
<xsl:param name="delimiter" select="' '"/>
<xsl:param name="name" select="'row'"/>
<xsl:variable name="token" select="substring-before(concat($text, $delimiter), $delimiter)" />
<xsl:if test="$token">
<xsl:element name="{$name}">
<xsl:value-of select="$token"/>
</xsl:element>
</xsl:if>
<xsl:if test="contains($text, $delimiter)">
<!-- recursive call -->
<xsl:call-template name="tokenize">
<xsl:with-param name="text" select="substring-after($text, $delimiter)"/>
<xsl:with-param name="delimiter" select="$delimiter"/>
<xsl:with-param name="name" select="$name"/>
</xsl:call-template>
</xsl:if>
</xsl:template>
</xsl:stylesheet>发布于 2021-02-28 21:07:08
我认为,如果用于标记化的模板需要找到空字符串标记,比如1,M,,0,5,,Personeelsvoorschot,0中两个逗号之间的空字符串,则需要删除xsl:if test="$token"。
https://stackoverflow.com/questions/66350093
复制相似问题