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>
请记住这是伪代码,因为我不知道如何做到这一点。现在,如果有人能帮助把我的伪装变成真实的东西。
答
我不认为你需要在获得第一次约会之前创建一个以逗号分隔的列表。这似乎有点额外的努力。你可以整理你的富在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
然后,您可以继续,并根据需要在此进行额外的日期格式。
这应该是直截了当的,但我对CSV要求进入它的位置感到困惑。如果你只想产生一个值,那么你不需要担心逗号分隔符。它将只是一个单一的领域。也许显示你的预期产出会有所帮助?谢谢! –
你好Tim,谢谢你的回复。这只是要创建的csv文档中的许多字段之一。 –
预期的输出将是:“2012_1_1”,虽然技术上我需要调用另一个我创建的dateFormat模板来格式化日期,如2012_JAN_1。 –