2016-07-29 24 views
1

Unten ist die XML-Eingabe:XSLT 1.0 fügen neue Elemente

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

Ich möchte es ändern:

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

Der Wert des ursprünglichen Elementfarben könnte jede Kombination von R, G und B. Meine Strategie besteht darin, für jeden Farbwert nach dem ersten Knoten ein neues Element hinzuzufügen.

<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> 

Ich bin mir nicht sicher, wie man das tatsächlich über XSLT implementiert. Oder würde es eine andere Strategie geben, um dies zum Laufen zu bringen?

+0

Dies ist für XSLT 1.0 –

+0

"* könnte eine beliebige Kombination von R, G und B sein. *" Sind alle möglichen Werte R, G und B im Voraus bekannt? - "* Dies ist für XSLT 1.0 *" Welcher XSLT 1.0-Prozessor im Besonderen? –

+0

Ja, die Werte sind nur alle Kombinationen von R, G und B –

Antwort

1

die Werte sind nur alle Kombinationen von R, G und B

Nun, dann könnte man einfach tun:

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

ein allgemeineres Ansatz ist es, eine rekursive Vorlage zu verwenden, um auf dem (konfigurierbaren) Trennzeichen zu teilen:

<?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> 
Verwandte Themen