XSLT 2无法识别TSV中的NULL值

时间:2014-12-26 05:52:49

标签: xslt

我正在解析TSV文件并仅使用少量列值。 如果某些列值为NULL,则XSLT不会识别它们并改为计算下一列。

如果我用一些数据更改NULL值,则XSLT正常工作。

有人可以帮忙吗?

<?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"
    exclude-result-prefixes="xs"
    version="2.0">

<xsl:output method="xml" indent="yes"/>

<xsl:param name="identifier"/>
<xsl:param name="csvData"/>

<xsl:template match="/">
    <xsl:variable name="csv" select="$csvData"/>
    <xsl:variable name="data">
    <data>
        <xsl:analyze-string select="$csv" regex="\n">
            <xsl:non-matching-substring>
                <row>
                    <xsl:analyze-string select="." regex="\t" flags="x">
                        <xsl:non-matching-substring>
                            <col>
                                <xsl:value-of select="normalize-space(.)"/>
                            </col>
                        </xsl:non-matching-substring>
                    </xsl:analyze-string>
                </row>
            </xsl:non-matching-substring>
        </xsl:analyze-string>
    </data>
    </xsl:variable>

    <xsl:result-document>
    <Events>
        <xsl:for-each select="$data//row">
            <Attendance>
                <RetID><xsl:value-of select="../$identifier"/></RetID>
                <AccountId><xsl:value-of select="col[1]"/></AccountId>
                <EventId><xsl:value-of select="col[2]"/></EventId>
                <EventName><xsl:value-of select="col[3]"/></EventName>
                <EventDate><xsl:value-of select="col[4]"/></EventDate>
                <EventTime><xsl:value-of select="col[5]"/></EventTime>  
            </Attendance>
        </xsl:for-each>
    </Events>
    </xsl:result-document>
</xsl:template>
</xsl:stylesheet>

1 个答案:

答案 0 :(得分:1)

假设&#34; NULL&#34;选项卡分隔数据中的值由两个连续的制表符表示,然后我建议替换

                <xsl:analyze-string select="." regex="\t" flags="x">
                    <xsl:non-matching-substring>
                        <col>
                            <xsl:value-of select="normalize-space(.)"/>
                        </col>
                    </xsl:non-matching-substring>
                </xsl:analyze-string>

                <xsl:for-each select="tokenize(., '\t')">
                        <col>
                            <xsl:value-of select="normalize-space(.)"/>
                        </col>
                </xsl:analyze-string>