2016-07-11 7 views
0

Da ich mit XSLT relativ unerfahren bin, stehe ich vor einem Problem und benötige Hilfe vom XSLT-Experten.Getrennte Zeichenketten, die dem Muster entsprechen

Die folgenden Produkttypen und die zugehörigen Codes sind 1 zu 1 in verschiedenen begrenzten Strings. Ich muss jeweils zwei aus der gleichen Position von zwei Strings extrahieren (siehe Beispiel unten). Außerdem kann die Anzahl der Produkttypen und Produktcodes in den begrenzten Strings variieren.

<OFFERINGS> 

    <PRODUCT> 
    <attribute name="PRODUCT_TYPES" value="GUL5, RIDER, LIR, WAIVER" /> 
    <attribute name="PRODUCT_CODES" value="SLG3AA, R001, LIR3, PW0001" /> 
    </PRODUCT> 

    <PRODUCT> 
    <attribute name="PRODUCT_TYPES" value="TERM8, WAIVER2" /> 
    <attribute name="PRODUCT_CODES" value="SP0007, PW0002" /> 
    </PRODUCT> 

</OFFERINGS> 

Um

<COVERAGES> 

    <GROUP_COVERAGE> 
    <COVERAGE> 
     <PRODUCT_TYPE>GUL5</PRODUCT_TYPE> 
     <PRODUCT_CODE>SLG3AA</PRODUCT_CODE> 
    </COVERAGE> 
    <COVERAGE> 
     <PRODUCT_TYPE>RIDER</PRODUCT_TYPE> 
     <PRODUCT_CODE>R001</PRODUCT_CODE> 
    </COVERAGE> 
    <COVERAGE> 
     <PRODUCT_TYPE>LIR</PRODUCT_TYPE> 
     <PRODUCT_CODE>LIR3</PRODUCT_CODE> 
    </COVERAGE> 
    <COVERAGE> 
     <PRODUCT_TYPE>WAIVER</PRODUCT_TYPE> 
     <PRODUCT_CODE>PW0001</PRODUCT_CODE> 
    </COVERAGE> 
    </GROUP_COVERAGE> 

    <GROUP_COVERAGE> 
    <COVERAGE> 
     <PRODUCT_TYPE>TERM8</PRODUCT_TYPE> 
     <PRODUCT_CODE>SP0007</PRODUCT_CODE> 
    </COVERAGE> 
    <COVERAGE> 
     <PRODUCT_TYPE>WAIVER2</PRODUCT_TYPE> 
     <PRODUCT_CODE>PW0002</PRODUCT_CODE> 
    </COVERAGE> 
    </GROUP_COVERAGE> 
</COVERAGES> 
+1

Bitte bearbeiten Sie Ihre Tags, um anzugeben, ob Sie XSLT 1 oder 2.0 verwenden? Was hast du bisher geschrieben? –

+0

Haben Sie eine Frage? – JLRishe

+0

Die Grundidee besteht darin, die "value" -Attribute in ihre Komponenten aufzuteilen und "call-template" mit den resultierenden Werten rekursiv zu verwenden. –

Antwort

1

Alles was Sie tun müssen, ist die Tokenisieren Vorlage aus your previous question nehmen und passen sie verwenden, um zwei Text Parameter statt eines:

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="*"/> 

<xsl:template match="/OFFERINGS"> 
    <COVERAGES> 
     <xsl:apply-templates/> 
    </COVERAGES> 
</xsl:template> 

<xsl:template match="PRODUCT"> 
    <COVERAGE> 
     <xsl:call-template name="tokenize"> 
      <xsl:with-param name="types" select="attribute[@name='PRODUCT_TYPES']/@value"/> 
      <xsl:with-param name="codes" select="attribute[@name='PRODUCT_CODES']/@value"/> 
     </xsl:call-template> 
    </COVERAGE> 
</xsl:template> 

<xsl:template name="tokenize"> 
    <xsl:param name="types"/> 
    <xsl:param name="codes"/> 
    <xsl:param name="delimiter" select="', '"/> 
    <xsl:variable name="type" select="substring-before(concat($types, $delimiter), $delimiter)" /> 
    <xsl:variable name="code" select="substring-before(concat($codes, $delimiter), $delimiter)" /> 
     <xsl:if test="$type"> 
      <COVERAGE> 
       <PRODUCT_TYPE> 
        <xsl:value-of select="$type"/> 
       </PRODUCT_TYPE> 
       <PRODUCT_CODE> 
        <xsl:value-of select="$code"/> 
       </PRODUCT_CODE> 
      </COVERAGE> 
     </xsl:if> 
     <xsl:if test="contains($types, $delimiter)"> 
      <!-- recursive call --> 
      <xsl:call-template name="tokenize"> 
       <xsl:with-param name="types" select="substring-after($types, $delimiter)"/> 
       <xsl:with-param name="codes" select="substring-after($codes, $delimiter)"/> 
      </xsl:call-template> 
     </xsl:if> 
</xsl:template> 

</xsl:stylesheet> 
+0

Vielen Dank! Mein Problem lag in der Logik der zweiten Vorlage. Ich habe die korrekten Parameter nicht bestanden. – user1747980

Verwandte Themen