XSLT:逗号分隔和自定义排序

时间:2017-10-25 12:48:22

标签: xml xpath xslt-1.0

我有以下文件(不应更改其结构):

<file>
    <one>First</one>
    <three>Third</three>
    <two>Second</two>
    <five>Fifth</five>
</file>

我正在寻找XSLT转换,它提供以下输出(自定义排序+逗号分隔):

    第一,第二,第三,第五

我要手动定义订单:

<xsl:apply-templates select="one">
<xsl:apply-templates select="two">
<xsl:apply-templates select="three">
<xsl:apply-templates select="four">
<xsl:apply-templates select="five">

请注意原始文件中缺少元素<four>

不幸的是,常用的逗号分离方法

<xsl:for-each select="one|two|three|four|five">
    <xsl:value-of select="."/>
    <xsl:if test="position() != last()">, </xsl:if>
</xsl:for-each>

在这种情况下不起作用。当然,我可以使用xsl:sort一些排序标准......

但也许有一个简单而优雅的解决方案,是吗?

2 个答案:

答案 0 :(得分:1)

如评论中所述,如果您可以使用XSLT 2.0,则可以执行此操作....

<xsl:for-each select="one,two,three,four,five">

在XSLT 1.0中,一种方法是两种做类似的事情。

    <xsl:for-each select="one|two|three|four|five">
        <xsl:sort select="string-length(substring-before('|one|two|three|four|five|', concat('|', local-name(), '|')))" />

或者,在这种情况下可能稍微简单......

    <xsl:for-each select="one|two|three|four|five">
        <xsl:sort select="string-length(substring-before('onetwothreefourfive',local-name()))" />

答案 1 :(得分:0)

对于元素onefour,如果元素存在,则需要一个逗号跟随其值,如果该元素不存在,则不需要逗号。

通过在负责模板中发出逗号很容易处理,因为当且仅当匹配元素存在时,才会评估相应的模板。

我会写

<xsl:template match="one|two|three|four">
  <xsl:value-of select="string()"/>
  <xsl:text>, </
</
<xsl:template match="five">
  <xsl:value-of select="string()"/>
</