我有一些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>
</field>
使用XSL
的空格分隔符答案 0 :(得分:2)
这个简短而简单(没有明确的条件指令)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>
<强> II。 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
attribute of xsl:value-of
的默认值为单个空格。
答案 1 :(得分:0)
类似的东西:
...
<fields>
<field name="all">
<value><xsl:apply-templates select="fields/field"/></value>
</field>
</fields>
...
<xsl:template match="field[value/text()]">
<xsl:value-of select="value"/>
<xsl:if test="position() != last()"><xsl:text> </xsl:text></xsl:if>
</xsl:template>
...