我有一个平面文件,我想使用XSLT转换为XML。 每行的第一个字符代表一块信息,我想将所有的东西组合在一起。 这些行可以以多个字符开头。我想要做的是在字符1
之间组合一组线段。平面文件XML分组
这里是输入文件的样子:
0xxxxxxxxxxxxxxxxxxxxxxxxx
1xxxxxxxxxxxxxxxxxxxxxxxxx
2xxxxxxxxxxxxxxxxxxxxxxxxx
3xxxxxxxxxxxxxxxxxxxxxxxxx
5xxxxxxxxxxxxxxxxxxxxxxxxx
8xxxxxxxxxxxxxxxxxxxxxxxxx
1xxxxxxxxxxxxxxxxxxxxxxxxx
2xxxxxxxxxxxxxxxxxxxxxxxxx
5xxxxxxxxxxxxxxxxxxxxxxxxx
8xxxxxxxxxxxxxxxxxxxxxxxxx
1xxxxxxxxxxxxxxxxxxxxxxxxx
8xxxxxxxxxxxxxxxxxxxxxxxxx
9xxxxxxxxxxxxxxxxxxxxxxxxx
的x
只是代表了我能照顾行数据。 我所希望做的是产品的:
<Root>
<Header> // O line
</Header>
<Summary id="xxxxx"> // First 1 line
<data_from_2>
</data_from_2>
<data_from_3>
</data_from_3>
<data_from_5>
</data_from_5>
<data_from_8>
</data_from_8>
</Summary>
<Summary id="xxxxx"> // Second 1 line
<data_from_2>
</data_from_2>
<data_from_3>
</data_from_3>
<data_from_5>
</data_from_5>
<data_from_8>
</data_from_8>
</Summary>
<Summary id="xxxxx"> // Third 1 line
<data_from_2>
</data_from_2>
<data_from_3>
</data_from_3>
<data_from_5>
</data_from_5>
<data_from_8>
</data_from_8>
</Summary>
<Footer> // 9 line
</Footer>
</Root>
困难的部分是,它是不知道多少行怎么会下1
线。 可能只有一行可以在它下面分组,也可以有多行。
这是我最初的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="newline" select="'
'" />
<xsl:variable name="tab" select="'	'" />
<xsl:template match="/">
<xsl:value-of select="$newline"/>
<FirstData>
<xsl:value-of select="$newline"/>
<xsl:for-each select="tokenize(.,'\r?\n')">
<!-- DETERMINE WHAT FIRST CHAR LOOKS LIKE -->
<xsl:variable name="lineToken" select="substring(., 1, 1)"/>
<!-- HEADER -->
<xsl:if test="$lineToken='0'">
<xsl:variable name="periodStart" select="substring(., 2, 6)"/>
<xsl:value-of select="$tab"/><HEADER><xsl:value-of select="$newline"/>
<xsl:value-of select="$tab"/><xsl:value-of select="$tab"/><Period_start_date><xsl:sequence select="$periodStart"/></Period_start_date><xsl:value-of select="$newline"/>
<xsl:value-of select="$tab"/></HEADER><xsl:value-of select="$newline"/>
</xsl:if>
<!-- SUMMARY -->
<xsl:if test="$lineToken='1'">
<xsl:value-of select="$tab"/><xsl:element name="SUMMARY">
<xsl:attribute name="ID"><xsl:value-of select ="substring(., 2, 11)"/></xsl:attribute>
<xsl:value-of select="$newline"/>
<xsl:variable name="ID" select="substring(., 2, 11)"/>
<xsl:variable name="batchDate" select="substring(., 13, 4)"/>
<xsl:value-of select="$tab"/><xsl:value-of select="$tab"/><ID><xsl:sequence select="$fdmsMerchantNum"/></FDMS_Merchant_Number><xsl:value-of select="$newline"/>
<xsl:value-of select="$tab"/><xsl:value-of select="$tab"/><Batch_Date><xsl:sequence select="$batchDate"/></Batch_Date><xsl:value-of select="$newline"/>
<xsl:value-of select="$tab"/></xsl:element><xsl:value-of select="$newline"/>
</xsl:if>
<!-- Data 2 -->
<xsl:if test="$lineToken='2'">
<xsl:value-of select="$tab"/><Data_2><xsl:value-of select="$newline"/>
<xsl:variable name="Sales" select="substring(., 2, 3)"/>
<xsl:value-of select="$tab"/><xsl:value-of select="$tab"/><Sales><xsl:sequence select="$Sales"/></Sales><xsl:value-of select="$newline"/>
<xsl:value-of select="$tab"/></Data_2><xsl:value-of select="$newline"/>
</xsl:if>
<!-- Data 3 -->
<xsl:if test="$lineToken='3'">
<xsl:value-of select="$tab"/><Data_3><xsl:value-of select="$newline"/>
<xsl:variable name="Sales" select="substring(., 2, 3)"/>
<xsl:value-of select="$tab"/><xsl:value-of select="$tab"/><Sales><xsl:sequence select="$Sales"/></Sales><xsl:value-of select="$newline"/>
<xsl:value-of select="$tab"/></Data_3><xsl:value-of select="$newline"/>
</xsl:if>
<!-- Data 5 and Data 8 elements are identical -->
</xsl:for-each>
</Root>
</xsl:template>
</xsl:stylesheet>
我想要做的是能嵌套数据2和数据汇总元素中3个元素,而是如何我是否会处理这些行,然后为下一个遇到的1行开始一个新的汇总元素?
我为人人,通用的东西对不起,我有很多的数据一起工作,我试图简化问题。 如果需要更多信息,请告诉我。
我知道你写的代码没有进行测试,但我得到的是说'多个项目的顺序是不允许的错误变量$ lines的值(<线/ >,<线/ > ...)'。我对XSL仍然很陌生,所以如果我完全不理解代码,我很抱歉。 – RXC
对不起,该变量的类型声明缺少'*',我已经纠正了这一点。 –
@RXC,我已经编辑与你应该能够更容易地适应您的需求比以前的建议,一个完整的代码示例答案。 –