我有一个xslt文件,它将csv文件转换为xml。 这是我的xslt:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:variable name="invoice_date" select="tokenize(., ',')[3]"/>
<xsl:template match="/">
<transactions>
<payee_transactions>
<xsl:for-each select="tokenize(.,'\r?\n')">
<!-- DETERMINE THE LINE -->
<xsl:variable name="line" select="tokenize(., ',')"/>
<xsl:if test="$line[1]='$$$'">
<xsl:variable name="batch_date" select="$line[3]"/>
<xsl:variable name="batch_count" select="$line[4]"/>
<xsl:variable name="batch_amount" select="$line[5]"/>
<batch_date><xsl:sequence select="normalize-space($batch_date)"/></batch_date>
<batch_count><xsl:sequence select="normalize-space($batch_count)"/></batch_count>
<batch_amount><xsl:sequence select="normalize-space($batch_amount)"/></batch_amount>
<batch_description><xsl:sequence select="normalize-space($batch_reference)"/> - Payees</batch_description>
</xsl:if>
<xsl:if test="$line[1]='PAY'">
<payee_transaction>
<xsl:variable name="payee_name" select="$line[2]"/>
<xsl:variable name="addr1" select="$line[4]"/>
<payee_name><xsl:value-of select="normalize-space($payee_name)"/></payee_name>
<payee_id><xsl:value-of select="normalize-space($source_system_id)"/></payee_id>
<payee_address_line1><xsl:value-of select="normalize-space($addr1)"/></payee_address_line1>
<amount><xsl:value-of select="normalize-space($amount)"/></amount>
<line_memo><xsl:value-of select="normalize-space($line_memo)"/></line_memo>
<invoice_date><xsl:value-of select="$batch_date"/></invoice_date>
</payee_transaction>
</xsl:if>
</xsl:for-each>
</payee_transactions>
</transactions>
</xsl:template>
</xsl:stylesheet>
我的主要问题是当我尝试在第二个if语句中使用batch_date
变量时出现编译器错误。
我希望每条记录的invoice_date
与batch_date
相同。
我查看了全局变量,但是我遇到了来自人的相同消息,无法在模板中重新分配全局变量,创建了具有相同名称的新变量。 所以,我想创建一个全局变量,并在我点击模板之前给它赋值,所以我总是拥有它。
我需要它从csv文件的第一行获取第三个元素。 我写的不起作用。
我该怎么做?
答案 0 :(得分:2)
使用此示例csv文件( Book1.csv )
<csv>
a,b,c
d,e,f
g,h,i
</csv>
和这个样式表
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes"/>
<xsl:variable name="batch_date">
<xsl:for-each select="tokenize(document('Book1.csv'), '\r?\n')[2]">
<xsl:for-each select="tokenize(.,',')[3]">
<xsl:value-of select="."></xsl:value-of>
</xsl:for-each>
</xsl:for-each>
</xsl:variable>
<xsl:template match="/">
<variable>
<xsl:value-of select="$batch_date"/>
</variable>
</xsl:template>
</xsl:stylesheet>
输出
<variable>c</variable>
看看你能否适应当前的问题。
答案 1 :(得分:1)
现在没有设置invoice_date
变量的范围,因为它在任何模板之外,这是“全局”变量的好地方。
<xsl:variable name="invoice_date" select="tokenize(., ',')[3]"/>
基于.
字符尚无意义。如果它更改为/
,它现在应该处理文档的范围。
<xsl:variable name="invoice_date" select="tokenize(/, ',')[3]"/>