这个简短而简单(没有明确的条件指令)的 XSLT 1.0 转换:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:template match="/*">
<fields>
<field name="all">
<xsl:variable name="vfieldConcat">
<xsl:for-each select="field/value">
<xsl:value-of select="concat(., ' ')"/>
</xsl:for-each>
</xsl:variable>
<value><xsl:value-of select=
"normalize-space($vfieldConcat)"/></value>
</field>
</fields>
</xsl:template>
</xsl:stylesheet>
当应用于所提供的 XML 文档时(针对格式正确进行了更正):
<fields>
<field name="first">
<value>example</value>
</field>
<field name="last">
<value>hello</value>
</field>
<field name="age">
<value>25</value>
</field>
<field name="enable">
<value>1</value>
</field>
</fields>
产生想要的正确结果:
<fields>
<field name="all">
<value>example hello 25 1</value>
</field>
</fields>
二、XSLT 2.0 解决方案
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:template match="/*">
<fields>
<field name="all">
<value><xsl:value-of select="field/value"/></value>
</field>
</fields>
</xsl:template>
</xsl:stylesheet>
当将此转换应用于同一个 XML 文档(如上)时,会产生相同的正确结果:
<fields>
<field name="all">
<value>example hello 25 1</value>
</field>
</fields>
解释:使用separator
属性xsl:value-of
的默认值是一个空格这一事实。