2017-02-08 1 views
0

Das Folgende ist das Eingabe-XML, das ein reasoncase-Element hat, das sich wiederholt. Wenn der Code unter reasonCase den Wert hat, beginnt er mit dem Antragsteller und erstellt dann den Antragsteller.Erzeuge wiederholte Elemente basierend auf dem Feldwert in xslt

<input> 
    <case> 
     <reasonCase> 
      <code>Applicant#1234</code> 
      <key>asd345</key> 
     </reasonCase> 
     <reasonCase> 
      <code>Applicant#1234</code> 
      <key>asd34567</key> 
     </reasonCase> 
     <reasonCase> 
      <code>Applicant#3456</code> 
      <key>asd1111</key> 
     </reasonCase> 
     <reasonCase> 
      <code>Applicant#7889</code> 
      <key>asd9999</key> 
     </reasonCase> 
    </case> 
</input> 

Erwartete Ausgang Code unter reasonCase mit demselben Wert in derselben Anmelderin Elemente in dem Ausgang und entsprechenden Elemente sein, sollte auch in dem gleichen Anmelderin Elemente

<output> 
     <case> 
      <applicant> 
       <objectid>1234</objectid> 
       <reason> 
        <key>asd345</key> 
       </reason> 
       <reason> 
        <key>asd34567</key> 
       </reason> 
      </applicant> 
      <applicant> 
       <objectid>3456</objectid> 
       <reason> 
        <key>asd1111</key> 
       </reason> 
      </applicant> 
      <applicant> 
       <objectid>7889</objectid> 
       <reason> 
        <key>asd9999</key> 
       </reason> 
      </applicant> 
     </case> 
    </output> 

Basierend auf dem reasonCase/Code sein sollte = start-with (Antragsteller) müssen die wiederholten Elemente Antragsteller und entsprechende Elemente erstellen.
Bitte geben Sie die unten Xslt zu finden, die ich

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
     <xsl:output method="xml"/> 
     <xsl:template match="/"> 
      <output> 
       <xsl:for-each select="/input/case/reasonCase"> 
        <xsl:variable name="code"> 
         <xsl:value-of select="./code"/> 
        </xsl:variable> 
        <xsl:choose> 
         <xsl:when test="starts-with(./code,'Applicant')"> 
          <Applicants> 
           <objectId> 
            <xsl:value-of select="substring-after(/*/*/*[code=$code]/code,'Applicant#')"/> 
           </objectId> 
           <reason> 
            <key><xsl:value-of select="/*/*/*[code=$code]/key"/></key> 
           </reason> 
          </Applicants> 
         </xsl:when> 
        </xsl:choose> 
       </xsl:for-each> 
      </output> 
     </xsl:template> 
    </xsl:stylesheet> 
versucht

Die Ausgabe, die ich ist bekam, wie unten

<output> 
    <Applicants> 
     <objectId>1234</objectId> 
     <reason> 
      <key>asd345</key> 
     </reason> 
    </Applicants> 
    <Applicants> 
     <objectId>1234</objectId> 
     <reason> 
      <key>asd345</key> 
     </reason> 
    </Applicants> 
    <Applicants> 
     <objectId>3456</objectId> 
     <reason> 
      <key>asd1111</key> 
     </reason> 
    </Applicants> 
    <Applicants> 
     <objectId>7889</objectId> 
     <reason> 
      <key>asd9999</key> 
     </reason> 
    </Applicants> 
</output> 

helfen Sie mir bitte, um die erwartete Ausgabe zu erhalten.

+0

Wo genau stecken Sie fest? –

+0

Ich habe die Anforderung wie oben gezeigt. Ich kann keine Logik für das selbe implementieren. Brauche Hilfe mit der Logik. – user1731504

+0

Wir sind nicht hier, um Ihren Code für Sie zu schreiben. Wenn Sie eine bestimmte Frage oder Schwierigkeit haben, zeigen Sie Ihren Versuch und fragen Sie, wie Sie ihn beheben können. –

Antwort

0

Xslt für dieses Problem

<xsl:template match="input"> 
    <output> 
     <case> 
      <xsl:for-each-group select="//code" group-by="text()"> 
       <xsl:variable name="code" select="text()"/> 
       <applicant> 
        <objectid><xsl:value-of select="substring-after(text(), '#')"/></objectid> 
        <xsl:for-each select="//key[preceding-sibling::code = $code]"> 
         <reason> 
          <xsl:copy-of select="."/> 
         </reason> 
        </xsl:for-each> 
       </applicant> 
      </xsl:for-each-group> 
     </case> 
    </output> 
</xsl:template> 

und Ausgang

<?xml version="1.0" encoding="UTF-8"?> 
<output> 
    <case> 
     <applicant> 
     <objectid>1234</objectid> 
     <reason> 
      <key>asd345</key> 
     </reason> 
     <reason> 
      <key>asd34567</key> 
     </reason> 
     </applicant> 
     <applicant> 
     <objectid>3456</objectid> 
     <reason> 
      <key>asd1111</key> 
     </reason> 
     </applicant> 
     <applicant> 
     <objectid>7889</objectid> 
     <reason> 
      <key>asd9999</key> 
     </reason> 
     </applicant> 
    </case> 
</output> 
+0

Danke dafür, aber wir brauchen es mit xslt 1.0 Version – user1731504

+0

Jetzt können Sie sehen, aktualisiert xslt 1.0 – Rupesh

+0

' zx485

1

Für 1,0 Xsl Sie

<xsl:template match="input"> 
<output> 
    <case> 
     <xsl:for-each select="//code[.!=preceding::code or not(preceding::code)]"> 
      <xsl:variable name="code" select="text()"/> 
      <Applicants> 
       <objectid><xsl:value-of select="substring-after(text(), '#')"/></objectid> 
       <xsl:for-each select="//key[preceding-sibling::code = $code]"> 
        <reason> 
         <xsl:copy-of select="."/> 
        </reason> 
       </xsl:for-each> 
      </Applicants> 
     </xsl:for-each> 
    </case> 
</output> 
können

und Ausgang hierfür ist

<?xml version="1.0" encoding="UTF-8"?> 
<output> 
    <case> 
     <Applicants> 
     <objectid>1234</objectid> 
     <reason> 
      <key>asd345</key> 
     </reason> 
     <reason> 
      <key>asd34567</key> 
     </reason> 
     </Applicants> 
     <Applicants> 
     <objectid>3456</objectid> 
     <reason> 
      <key>asd1111</key> 
     </reason> 
     </Applicants> 
     <Applicants> 
     <objectid>7889</objectid> 
     <reason> 
      <key>asd9999</key> 
     </reason> 
     </Applicants> 
    </case> 
</output> 
+0

Dies ist keine gute Methode - siehe hier, warum: http://www.jenitennison.com/xslt/grouping/muenchian.html –

Verwandte Themen