我有以下文件(不应更改其结构):
<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
一些排序标准......
但也许有一个简单而优雅的解决方案,是吗?
答案 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)
对于元素one
到four
,如果元素存在,则需要一个逗号跟随其值,如果该元素不存在,则不需要逗号。
通过在负责模板中发出逗号很容易处理,因为当且仅当匹配元素存在时,才会评估相应的模板。
我会写
<xsl:template match="one|two|three|four">
<xsl:value-of select="string()"/>
<xsl:text>, </
</
<xsl:template match="five">
<xsl:value-of select="string()"/>
</