2016-07-29 169 views
1

下面是输入XML:XSLT 1.0添加新元素

<car> 
    <colors>R+G+B</colors> 
</car> 

我想将其变更为:

<car> 
    <colors>R</colors> 
    <colors>G</colors> 
    <colors>B</colors> 
</car> 

原始色彩元素的值可以为R的任意组合, G和B.我的策略是在第一个节点之后为每个颜色值添加一个新元素。

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

<xsl:template match="/ImageProductOrder/color"> 
//insert another color element here 
</xsl:template> 

我不知道如何通过XSLT实际实现这个。或者是否有另一种策略来实现这一目标?

+0

这是用于XSLT 1.0 –

+0

“*可以是R,G和B的任意组合。”所有可能的值R,G和B是否预先知道? - “*这是用于XSLT 1.0 *”特别是哪款XSLT 1.0处理器? –

+0

是的值只是R,G和B的所有组合 –

回答

1

的值只是所有的R,G和B组合

那么,你可能只是做:

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 
<xsl:strip-space elements="*"/> 

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

<xsl:template match="colors"> 
    <xsl:if test="contains(., 'R')"> 
     <colors>R</colors> 
    </xsl:if> 
    <xsl:if test="contains(., 'B')"> 
     <colors>B</colors> 
    </xsl:if> 
    <xsl:if test="contains(., 'G')"> 
     <colors>G</colors> 
    </xsl:if> 
</xsl:template> 

</xsl:stylesheet> 
0

一个更通用方法是使用递归模板分割(可配置)分隔符:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
    <xsl:output indent="yes"/> 

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

    <xsl:template match="colors"> 
     <xsl:call-template name="make-color"> 
      <xsl:with-param name="val" select="."/> 
     </xsl:call-template> 
    </xsl:template> 

    <xsl:template name="make-color"> 
     <xsl:param name="val"/> 
     <xsl:param name="delim" select="'+'"/> 
     <xsl:choose> 
      <xsl:when test="contains($val, $delim)"> 
       <color><xsl:value-of select="substring-before($val, $delim)"/></color> 
       <xsl:call-template name="make-color"> 
        <xsl:with-param name="val" select="substring-after($val, $delim)"/> 
        <xsl:with-param name="delim" select="$delim"/> 
       </xsl:call-template> 
      </xsl:when> 
      <xsl:otherwise> 
       <color><xsl:value-of select="$val"/></color> 
      </xsl:otherwise> 
     </xsl:choose> 
    </xsl:template> 

</xsl:stylesheet>