XSL在多个XML中连接元素的所有值

时间:2014-06-06 14:31:04

标签: xml xslt

我有一个输入XML,如下所示。我需要将所有isCloseOut元素值连接到具有输出值的单个isCloseOut元素。需要帮助为此编写xsl。

输入

<date>
<isCloseOut>true</isCloseOut>
<value>23</value>
</date>
<date>
<isCloseOut>false</isCloseOut>
<value>26</value>
</date>
<date>
<isCloseOut>false</isCloseOut>
<value>29</value>
</date>

输出

<date>
<isCloseOut>truefalsefalse</isCloseOut>
 <value>23+26+29</value>
 </date>

1 个答案:

答案 0 :(得分:2)

使用string-join()函数的XSLT 2.0解决方案:

<xsl:stylesheet version="2.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output indent="yes"/>

    <xsl:template match="node()|@*">
        <xsl:copy>
            <xsl:apply-templates select="node()|@*"/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="/">
      <date>
         <isCloseOut>
           <xsl:value-of select="string-join(//date/isCloseOut,'')"/>
         </isCloseOut>
         <value><xsl:value-of select="string-join(//date/value,'+')"/></value>
      </date>
    </xsl:template>

</xsl:stylesheet>

使用命名模板的XSLT 1.0解决方案,发送要处理的节点和可选的分隔符:

<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output indent="yes"/>

    <xsl:template match="/">
        <date>
            <isCloseOut>
                <xsl:call-template name="string-join">
                <xsl:with-param name="nodes" select="//date/isCloseOut"/>
                </xsl:call-template> 
            </isCloseOut>
            <value>
                <xsl:call-template name="string-join">
                    <xsl:with-param name="nodes" select="//date/value"/>
                    <xsl:with-param name="delimiter" select="'+'"/>
                </xsl:call-template> 
            </value>
        </date>
    </xsl:template>

    <xsl:template name="string-join">
        <xsl:param name="nodes"/>
        <xsl:param name="delimiter" />
        <xsl:for-each select="$nodes">
            <xsl:value-of select="."/>
            <xsl:if test="$nodes[position() > 1]">
              <xsl:value-of select="$delimiter"/>
            </xsl:if>
        </xsl:for-each>
    </xsl:template>

</xsl:stylesheet>