我有一个输入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>
答案 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>