XSL:XML到CSV转换 - 为价值搜索列表,否则输出空场

问题描述:

我有一个XML结构,如:XSL:XML到CSV转换 - 为价值搜索列表,否则输出空场

<foos> 
     <foo> 
     <foo_type>1</foo_type> 
     <foo_date>2011_1_1</foo_date> 
     </foo> 
     <foo> 
     <foo_type>1</foo_type> 
     <foo_date>2012_1_1</foo_date> 
     </foo> 
     <foo> 
     <foo_type>2</foo_type> 
     <foo_date>2011_1_1</foo_date> 
     </foo> 
    </foos> 

我需要做的是从生产这一个值,其中foo_type == 1并且日期是最近的日期。以前我使用降序排序来查看日期列表。如果没有foo_type == 1的foo,它应该产生一个空字段。 (字段用引号括起来,逗号是分隔符。)

我想通过构建1类型的所有foos列表来做这件事。我不知道如何在xsl中做到这一点。像这样也许:

 <xsl:variable name="fooList"> 
      <xsl:for-each select="foos/foo"> 
       <xsl:if test="contains(foo_type, '1')"> 
        <xsl:value-of select="concat($fooList, ', ', foo_date)"/> 
       </xsl:if> 
      </xsl:for-each> 
     </xsl:variable> 

的话,我将会解析逗号分隔的列表和排序,以确定最新日期:

 <xsl:variable name="latestFooDate"> 
      <xsl:sort select="split(fooList)" order="descending" /> 
     </xsl:variable> 

最后调用模板来格式化结果:

 <xsl:call-template name="dateFormat"> 
      <xsl:with-param name="date" select="latestFooDate" /> 
     </xsl:call-template> 

请记住这是伪代码,因为我不知道如何做到这一点。现在,如果有人能帮助把我的伪装变成真实的东西。

+1

这应该是直截了当的,但我对CSV要求进入它的位置感到困惑。如果你只想产生一个值,那么你不需要担心逗号分隔符。它将只是一个单一的领域。也许显示你的预期产出会有所帮助?谢谢! –

+0

你好Tim,谢谢你的回复。这只是要创建的csv文档中的许多字段之一。 –

+0

预期的输出将是:“2012_1_1”,虽然技术上我需要调用另一个我创建的dateFormat模板来格式化日期,如2012_JAN_1。 –

我不认为你需要在获得第一次约会之前创建一个以逗号分隔的列表。这似乎有点额外的努力。你可以整理你的富在XSL要素:对,每个语句,然后只得到第一个(即一个与位置()= 1

试试这个模板匹配FOOS元件

<xsl:template match="foos"> 
     <xsl:for-each select="foo[foo_type='1']"> 
     <xsl:sort select="foo_date" /> 
     <xsl:if test="position() = 1"> 
      <xsl:value-of select="foo_date" /> 
     </xsl:if> 
     </xsl:for-each> 
    </xsl:template> 

此遍历所有FOO元素以1:1的foo_type,但随后只对第一一个的任何处理。

当你使用这个模板来匹配您给定的输入XML,输出应该再是

2011_1_1 

然后,您可以继续,并根据需要在此进行额外的日期格式。