2017-05-21 4 views
0

Ich habe quer durch gesucht, festgestellt, dass Variablen in XSLT unveränderlich (Konstanten) sind. Ich habe zwei Fragen.
Beispiel Eingabe XML wird angegeben.XSLT 1.0: Anzahl der übereinstimmenden Blöcke zählen und Karte erstellen

<employees> 
    <!-- Block1 --> 
    <employee> 
     <id>123</id> 
     <name>steve</name> 
     <work>developer</work> 
    </employee> 
    <employee> 
     <id>444</id> 
     <name>mark</name> 
     <work>developer</work> 
    </employee> 
    <employee> 
     <id>444</id> 
     <name>alex</name> 
     <work>tester</work> 
    </employee> 
    <employee> 
     <id>555</id> 
     <name>john</name> 
     <work>architect</work> 
    </employee> 
    <!-- Block 2--> 
    <projects> 
     <project> 
      <pid>p2</pid> 
      <roles> 
       <role>developer</role> 
       <role>tester</role> 
      </roles> 
      <total>30</total> 
     </project> 
     <project> 
      <pid>p4</pid> 
      <roles> 
       <role>tester</role> 
      </roles> 
      <total>3</total> 
     </project> 
     <project> 
      <pid>p3</pid> 
      <roles> 
       <role>architect</role> 
      </roles> 
      <total>2</total> 
     </project> 
    </projects> 
</employees> 

output:

Scenario (Ques): 2

Teil von:

<Projects> 
     <pid>p2</pid> 
     <employees> 
      <empName>steve</empName> 
      <empName>mark</empName> 
      <empName>alex</empName> 
     </employees> 
    </Projects> 

Not Part of : 

<Projects> 
     <pid>p2</pid> 
     <employees-exclude> 
      <empName>john</empName> 
     </employees-exclude> 
    </Projects> 

Scenario (Ques): 3

<Projects> 
    <pid>p2</pid> 
    <empList> 
     <emp> 
      <resource>1</resource> 
      <!-- like GUID , unique, increment starts from '1'--> 
      <empName>steve</empName> 
     </emp> 
     <emp> 
      <resource>2</resource> 
      <!-- like GUID , unique--> 
      <empName>mark</empName> 
     </emp> 
     <emp> 
      <resource>3</resource> 
      <!-- like GUID , unique--> 
      <empName>alex</empName> 
     </emp> 
    </empList> 
</Projects> 

Fragen:

  1. Kann ich eine Karte erstellen, die alle Mitarbeiterdetails verwaltet. (Key wäre "Arbeit" und Wert wäre eine Liste von ID + Name), ist es möglich? Ausgabe: Ich möchte die Emp-Liste basierend auf Projekt-ID vorbereiten. da ist eine Logik herum. Also muss ich eine Liste vorbereiten.
  2. Für die angegebene Projekt-ID (PID), möchte ich alle Mitarbeiter, die basierend auf Arbeit (aus Block1) basierend auf Rolle (Block2) ausgewählt werden, und wer sind nicht Teil davon? Eingabe wäre Ausgabe:

  3. Um die Anzahl der übereinstimmenden Einträge zu zählen? Wir haben'position() ', die besagt, dass die aktuelle Iteration in for-Schleife. aber ich möchte nur einen übereinstimmenden Block. Beispiel, wenn es 3 Mitarbeiter gibt, die von 6 angepasst wurden. Ich brauche den Wert, der angehängt werden soll, ressource + unique-Id. unique-id beginnt mit '1'. Ausgang:

geschätzt viel Ihre Hilfe und Unterstützung.

+0

Ihre Frage ist nicht ganz klar. Es wäre hilfreich, das erwartete Ergebnis der Transformation des gegebenen Beispiels zu sehen. Im Allgemeinen können Sie einen ** [key] (https://www.w3.org/TR/xslt/#key) ** verwenden, um die berechtigten Mitarbeiter aus dem Kontext eines Projekts (oder einer Rolle) abzurufen. Ich bin mir nicht sicher, was Sie mit "nicht Teil davon" meinen. –

+0

@Michel, ich habe meine Frage bearbeitet, erwartete Ausgabe hinzugefügt. Vielen Dank, – panneer

+0

Woher kommt der "Eingang" ('p2')? Und warum wird 'alex' in Szenario 3 vom Ergebnis ausgeschlossen? –

Antwort

0

Im Interesse dieses vorwärts zu bewegen, versuchen Sie dies als Ausgangspunkt:

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:key name="emp-by-work" match="employee" use="work" /> 

<xsl:template match="/employees"> 
    <projects> 
     <xsl:for-each select="projects/project"> 
      <xsl:variable name="emp-include" select="key('emp-by-work', roles/role)" /> 
      <project> 
       <xsl:copy-of select="pid"/> 
       <empList> 
        <xsl:for-each select="$emp-include"> 
         <emp> 
          <resource> 
           <xsl:value-of select="position()"/> 
          </resource> 
          <empName> 
           <xsl:value-of select="name"/> 
          </empName> 
         </emp> 
        </xsl:for-each> 
       </empList> 
      </project> 
     </xsl:for-each> 
    </projects> 
</xsl:template> 

</xsl:stylesheet> 

Dies gibt eine nummerierte Liste der berechtigten Mitarbeiter für jedes Projekt - ähnlich wie Ihre # 3 Szenario:

<?xml version="1.0" encoding="UTF-8"?> 
<projects> 
    <project> 
    <pid>p2</pid> 
    <empList> 
     <emp> 
     <resource>1</resource> 
     <empName>steve</empName> 
     </emp> 
     <emp> 
     <resource>2</resource> 
     <empName>mark</empName> 
     </emp> 
     <emp> 
     <resource>3</resource> 
     <empName>alex</empName> 
     </emp> 
    </empList> 
    </project> 
    <project> 
    <pid>p4</pid> 
    <empList> 
     <emp> 
     <resource>1</resource> 
     <empName>alex</empName> 
     </emp> 
    </empList> 
    </project> 
    <project> 
    <pid>p3</pid> 
    <empList> 
     <emp> 
     <resource>1</resource> 
     <empName>john</empName> 
     </emp> 
    </empList> 
    </project> 
</projects> 

die ausgeschlossenen Mitarbeiter auflisten zu können, so etwas tun könnte (leider gibt es keine „negative“ key):

<xsl:template match="/employees"> 
    <projects> 
     <xsl:for-each select="projects/project"> 
      <project> 
       <xsl:copy-of select="pid"/> 
       <employees-exclude> 
        <xsl:for-each select="/employees/employee[not(work = current()/roles/role)]"> 
         <emp> 
          <empName> 
           <xsl:value-of select="name"/> 
          </empName> 
         </emp> 
        </xsl:for-each> 
       </employees-exclude> 
      </project> 
     </xsl:for-each> 
    </projects> 
</xsl:template> 

zurückzukehren:

<?xml version="1.0" encoding="UTF-8"?> 
<projects> 
    <project> 
    <pid>p2</pid> 
    <employees-exclude> 
     <emp> 
     <empName>john</empName> 
     </emp> 
    </employees-exclude> 
    </project> 
    <project> 
    <pid>p4</pid> 
    <employees-exclude> 
     <emp> 
     <empName>steve</empName> 
     </emp> 
     <emp> 
     <empName>mark</empName> 
     </emp> 
     <emp> 
     <empName>john</empName> 
     </emp> 
    </employees-exclude> 
    </project> 
    <project> 
    <pid>p3</pid> 
    <employees-exclude> 
     <emp> 
     <empName>steve</empName> 
     </emp> 
     <emp> 
     <empName>mark</empName> 
     </emp> 
     <emp> 
     <empName>alex</empName> 
     </emp> 
    </employees-exclude> 
    </project> 
</projects> 
+0

Vielen Dank Michael. – panneer

+0

@panneer Wenn Ihre Frage beantwortet wird, schließen Sie sie bitte, indem Sie die Antwort akzeptieren. –