2016-07-29 172 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>