如何在XSL中的序列中添加缺失记录

时间:2015-07-01 09:18:00

标签: xslt-1.0 xslt-2.0

<data>
<Ent>
<Fld1>01<Fld1>
<Fld2>ABC<Fld2>
</Ent>
<Ent>
<Fld1>05<Fld1>
<Fld2>ABC<Fld2>
</Ent>
<Ent>
<Fld1>02<Fld1>
<Fld2>ABC<Fld2>
</Ent>
<Ent>
<Fld1>AA<Fld1>
<Fld2>ABCd<Fld2>
</Ent>

</data>

我必须 1)根据节点Fld1对记录进行排序。如果Fld1中的值是String我忽略它 2)如果我在分类记录中有一些丢失的数字,我必须添加它们

Over All我的输出应该是

01 ABC
02 ABC
03 Empty
04 Empty
05 ABC

一个人可以帮助我如何在xslt中完成此任务。

1 个答案:

答案 0 :(得分:0)

假设XSLT 2.0我首先会对您感兴趣的元素进行排序,然后只需处理1 to xs:integer($sorted[last()]/Fld1)

<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"
  xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="xs">


    <xsl:output method="text"/>

    <xsl:template match="data">
        <xsl:variable name="sorted" as="element(Ent)*">
            <xsl:perform-sort select="Ent[matches(Fld1, '[0-9]+')]">
                <xsl:sort select="xs:integer(Fld1)"/>
            </xsl:perform-sort>
        </xsl:variable>
        <xsl:for-each select="1 to xs:integer($sorted[last()]/Fld1)">
            <xsl:value-of select="concat(format-number(., '00'), ' ', ($sorted[xs:integer(Fld1) = current()]/Fld2, 'Empty')[1], '&#10;')"/>
        </xsl:for-each>
    </xsl:template>
</xsl:transform>

请参阅使用Saxon 9.5和输出的http://xsltransform.net/6qVRKwR

01 ABC
02 ABC
03 Empty
04 Empty
05 ABC