XSLT将2个节点组合到一个新节点中

时间:2014-11-13 11:22:55

标签: xml xslt

我正在努力克服XML和XSLt转换,我有以下几点。

<<?xml version="1.0" encoding="utf-8"?>
<playlist>
  <song>
    <title>Little Fluffy Clouds</title>
    <artist>the Orb</artist>
  </song>
</playlist>

我想将title和artits组合成一个名为:info

的新节点

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output indent="yes"/>
    <!--Identity Transform.-->
    <xsl:template match="node()|@*">
        <xsl:copy>
            <xsl:apply-templates select="node()|@*"/>
        </xsl:copy>
    </xsl:template>
    <xsl:template match="title | artits">
        <info>
            <xsl:value-of select="."/>
        </info>
    </xsl:template> 
</xsl:stylesheet>

以上回报:

<playlist>
  <info>Little Fluffy Clouds</info>
  <info>the Orb</info>
</playlist>
 

我需要结合这些,这应该是简单但我不能正确,我想要的是:

<playlist>
  <info>Little Fluffy Clouds the Orb</info>
</playlist>

1 个答案:

答案 0 :(得分:1)

您可以使用song的模板,并为其子级的文本节点使用apply-templates,如下所示:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes"/>
<!--Identity Transform.-->
<xsl:template match="node()|@*">
    <xsl:copy>
        <xsl:apply-templates select="node()|@*"/>
    </xsl:copy>
</xsl:template>
<xsl:template match="song">
    <xsl:copy>
        <info>
            <xsl:apply-templates select="title/text()"/>
            <xsl:text> </xsl:text>
            <xsl:apply-templates select="artist/text()"/>
        </info>
    </xsl:copy>
</xsl:template> 
</xsl:stylesheet>

您也可以使用:

<info>
    <xsl:value-of select="concat(title,' ',artist)"/>
</info>