首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在不移动单元格值的情况下从XSLT代码中的csv读取空值

在不移动单元格值的情况下从XSLT代码中的csv读取空值
EN

Stack Overflow用户
提问于 2021-02-24 19:35:41
回答 1查看 36关注 0票数 0

我有来自csv文件的这两行

代码语言:javascript
复制
<ROOT>
1,M,40,0,5,0,Personeelsvoorschot,0
2,M,40,0,6,0,Personeelsvoorschot,0
</ROOT>

在XSLT代码中,我获取标记中的每个单元格,如下所示(行号、哑元1等),但是当我尝试放置任何具有空值的单元格并进行测试时,出现了这个问题,标记没有获取空值,它获取的下一个单元格值是错误的,我将非常感谢您的帮助

代码语言:javascript
复制
    <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="'&#10;'"/>
    <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>
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-02-28 21:07:08

我认为,如果用于标记化的模板需要找到空字符串标记,比如1,M,,0,5,,Personeelsvoorschot,0中两个逗号之间的空字符串,则需要删除xsl:if test="$token"

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66350093

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档