2010-11-11 45 views
-1

我有一个非常大的XSL文件将XML转换为CSV。基本上,XML的结构是表格数据。这个表格中有大约90列(不是我的决定!)。这些列组成一个列组。每个列组都有一个第一个值和一个第二个值,一个可选的第三个值和一个决定在组中选择哪个值的选择 - 这由F,S或T-(F)irst /(S)表示,的Econd /(T)Hird的。 该行的主键是日期时间列。以匹配元素结尾的兄弟姐妹分组

XML如下(不是这是一个减少版本)。因此,我们将举例说第30列。

<data> 
<columns> 
    <column id="0"> 
    <name>Date Time</name> 
    <type>DateTime</type> 
    </column> 
    <column id="1"> 
    <name>Column Group 1 First</name> 
    <type>Double</type> 
    </column> 
    <column id="2"> 
    <name>Column Group 1 Second</name> 
    <type>Double</type> 
    </column> 
    <column id="3"> 
    <name>Column Group 1 Third</name> 
    <type>Double</type> 
    </column> 
    <column id="4"> 
    <name>Column Group 1 Selection</name> 
    <type>String</type> 
    </column> 
    <column id="5"> 
    <name>Column Group 2 First</name> 
    <type>Double</type> 
    </column> 
    <column id="6"> 
    <name>Column Group 2 Second</name> 
    <type>Double</type> 
    </column> 
    <column id="7"> 
    <name>Column Group 2 Third</name> 
    <type>Double</type> 
    </column> 
    <column id="8"> 
    <name>Column Group 2 Selection</name> 
    <type>String</type> 
    </column> 
    <!-- This group does not have Third--> 
    <column id="9"> 
    <name>Column Group 3 First</name> 
    <type>Double</type> 
    </column> 
    <column id="10"> 
    <name>Column Group 3 Second</name> 
    <type>Double</type> 
    </column> 
    <column id="11"> 
    <name>Column Group 3 Selection</name> 
    <type>String</type> 
    </column> 
</columns> 
<rows> 
    <row id="0"> 
    <columns> 
    <column id="0"> 
    <name>Date Time</name> 
    <universalDate>2010-10-10 11:30:00</universalDate> 
    </column> 
    <!-- Group 1 - - - - - - - - - - - - - - - - --> 
    <column id="1"> 
    <name>Column Group 1 First</name> 
    <displayValue>100.123</displayValue> 
    <value>100.123</value> 
    </column> 
    <column id="2"> 
    <name>Column Group 1 Second</name> 
    <displayValue>Missing</displayValue> 
    <value>-2.50E+08</value> 
    </column> 
    <column id="3"> 
    <name>Column Group 1 Third</name> 
    <displayValue>Missing</displayValue> 
    <value>-2.50E+08</value> 
    </column> 
    <column id="4"> 
    <name>Column Group 1 Selection</name> 
    <displayValue>F</displayValue> 
    <value>F</value> 
    </column> 
    <!-- Group 2 - - - - - - - - - - - - - - - - --> 
    <column id="5"> 
    <name>Column Group 2 First</name> 
    <displayValue>Missing</displayValue> 
    <value>-2.50E+08</value> 
    </column> 
    <column id="6"> 
    <name>Column Group 2 Second</name> 
    <displayValue>Missing</displayValue> 
    <value>-2.50E+08</value> 
    </column> 
    <column id="7"> 
    <name>Column Group 2 Third</name> 
    <displayValue>93.123</displayValue> 
    <value>93.123</value> 
    </column> 
    <column id="8"> 
    <name>Column Group 2 Selection</name> 
    <displayValue>T</displayValue> 
    <value>T</value> 
    </column> 
    <!-- Group 3 - - - - - - - - - - - - - - - - --> 
    <column id="9"> 
    <name>Column Group 3 First</name> 
    <displayValue>500.3</displayValue> 
    <value>500.3</value> 
    </column> 
    <column id="10"> 
    <name>Column Group 3 Second</name> 
    <displayValue>22.21</displayValue> 
    <value>22.21</value> 
    </column> 
    <column id="11"> 
    <name>Column Group 3 Third</name> 
    <displayValue>S</displayValue> 
    <value>S</value> 
    </column> 
    </columns> 
    </row> 
    <!-- Other rows omitted --> 
</rows> 
</data> 

所需的输出将是:

Date Time,Column Group 1 Primary,Column Group 1 Secondary,Column Group 1 Third,Column Group 1 Selection 
Date Time,Column Group 2 Primary,Column Group 2 Secondary,Column Group 2 Third,Column Group 2 Selection 
Date Time,Column Group 3 Primary,Column Group 3 Secondary,Column Group 3 Third,Column Group 3 Selection 
... and so on ... 

所以输出实际上是:

2010-10-10 11:30:00,100.123,,,F    
2010-10-10 11:30:00,,,93.123,T    
2010-10-10 11:30:00,500.3,22.21,,S   

有几个规则: 如果displayValue =丢失,则输出空串。 如果该组没有第三个值,则输出空字符串。

我的XSL的第一个实例是对每一组列重复进行此检查,这些列看起来非常可怕并且太大。

问题是 - 是否可以使用模板输出以下XML?我刚刚开始制作模板(感谢其他帖子中的其他人的帮助),但这让我有点卡住了。

我可以在列和行之间进行链接,以输出表xml中的所有行列数据,但是这或多或少地将3列一起组成基于名称的第一部分。

我对这种情况下XSL样子:

<xsl:for-each select="//rows/row"> 
<xsl:value-of select="columns/column[name='Date Time']/universalDate"/> 
<xsl:text>,</xsl:text> 
<xsl:if test="number(columns/column[name='Column 1 First']/value)"> 
    <xsl:value-of select="format-number(columns/column[name='Column 1 First']/value,'0')"/> 
    </xsl:if> 
    <xsl:text>,</xsl:text> 
    <xsl:if test="number(columns/column[name='Column 1 Second']/value)"> 
    <xsl:value-of select="format-number(columns/column[name='Column 1 Second']/value,'0')"/> 
    </xsl:if> 
    <xsl:text>,</xsl:text> 
    <xsl:if test="number(columns/column[name='Column 1 Third']/value)"> 
    <xsl:value-of select="format-number(columns/column[name='Column 1 Third']/rawValue,'0')"/> 
    </xsl:if> 
    <xsl:text>,</xsl:text> 
    <xsl:if test="columns/column[name='Column 1 Selection']/value='F'"> 
    <xsl:value-of select="format-number(columns/column[name='Column 1 First']/value,'0')"/> 
    </xsl:if> 
    <xsl:if test="columns/column[name='Column 1 Selection']/value='S'"> 
    <xsl:value-of select="format-number(columns/column[name='Column 1 Second']/value,'0')"/> 
    </xsl:if> 
    <xsl:if test="columns/column[name='Column 1 Selection']/value='T'"> 
    <xsl:value-of select="format-number(columns/column[name='Column 1 Third']/value,'0')"/> 
    </xsl:if> 
    <!-- new line required --> 
    <xsl:text>&#xA;</xsl:text> 
    <xsl:value-of select="columns/column[name='Date Time']/universalDate"/> 
    <xsl:text>,</xsl:text> 
    <xsl:if test="number(columns/column[name='Column 2 First']/value)"> 
    <xsl:value-of select="format-number(columns/column[name='Column 1 First']/value,'0')"/> 
    </xsl:if> 
    <xsl:text>,</xsl:text> 
    <xsl:if test="number(columns/column[name='Column 2 Second']/value)"> 
    <xsl:value-of select="format-number(columns/column[name='Column 1 Second']/value,'0')"/> 
    </xsl:if> 
    <xsl:text>,</xsl:text> 
    <xsl:if test="number(columns/column[name='Column 2 Third']/value)"> 
    <xsl:value-of select="format-number(columns/column[name='Column 2 Third']/value,'0')"/> 
    </xsl:if> 
    <xsl:text>,</xsl:text> 
    <xsl:if test="columns/column[name='Column 2 Selection']/value='F'"> 
    <xsl:value-of select="format-number(columns/column[name='Column 2 First']/value,'0')"/> 
    </xsl:if> 
    <xsl:if test="columns/column[name='Column 2 Selection']/value='S'"> 
    <xsl:value-of select="format-number(columns/column[name='Column 2 Second']/value,'0')"/> 
    </xsl:if> 
    <xsl:if test="columns/column[name='Column 2 Selection']/value='T'"> 
    <xsl:value-of select="format-number(columns/column[name='Column 2 Third']/value,'0')"/> 
    </xsl:if> 
    <!-- new line required --> 
    <xsl:text>&#xA;</xsl:text> 

    <!-- and so on....... --> 

对不起,我在第一实例澄清。

感谢,

Andez

+0

显示您提供的XML输入的一些示例CSV输出(使用编辑按钮将其添加到您的问题中) – 2010-11-11 18:15:48

+0

根本不清楚。从提供的XML文档中产生的确切输出应该是什么?请提供确切的输出。另外,应该规定什么样的处理:请列出从源XML节点到所需输出的所有规则和映射。 – 2010-11-11 18:33:44

+0

我已经更新了。希望这次更有意义。 – Andez 2010-11-12 11:52:06

回答

1

这个样式表:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="text"/> 
    <xsl:template match="row/columns/column[substring(name,16)='First']"> 
     <xsl:variable name="vOptional" 
         select="following::column[2] 
           [substring(name,16)='Third']"/> 
     <xsl:value-of select="concat(../column[1]/universalDate,',', 
            displayValue[.!='Missing'],',', 
            following::column[1] 
             /displayValue[.!='Missing'],',', 
            $vOptional/displayValue[.!='Missing'],',', 
            following::column[2 + boolean($vOptional)] 
             /displayValue[.!='Missing'],'&#xA;')"/> 
    </xsl:template> 
    <xsl:template match="data/columns|column"/> 
</xsl:stylesheet> 

输出:

2010-10-10 11:30:00,100.123,,,F 
2010-10-10 11:30:00,,,93.123,T 
2010-10-10 11:30:00,500.3,22.21,,S 

编辑:更好。我锁定了以前的逻辑,对不起。

+0

嗨亚历杭德罗。我转发了这个问题。试图让我的头仍然是xsl。感谢您的回应。对于转贴问题,这是否也会这样做? – Andez 2010-11-12 17:08:41

+0

@Andez:这个问题需要澄清。那样的话,其他人已经低调或投票结束。我看到您的转贴。别。只需编辑这一个。 – 2010-11-12 17:30:29

+0

@Alejandro这次对你有意义吗?我试图把它从我试图解决的问题中解决出来。我只是想从xsl的角度来解释一下如何解决这个问题 - 用几个指针和xsl函数来看看。 – Andez 2010-11-12 17:45:00