2012-04-05 3 views
0

Bitte helfen Sie mit folgenden fehlgeschlagen:Sheet zu überprüfen, ob ein jeder Test für jeden ein XML-Dokument des Knotens

Ich habe eine Eingabedatei, die sehr heterogen und groß ist.

Ich muss einzelne Tests auf einzelnen Knoten ausführen und am Ende einen booleschen Wert ausgeben: Hat ein Test fehlgeschlagen? oder sind sie alle bestanden?

Gibt es einen guten Weg, das zu tun?

Ich habe unten ein Beispiel ausführlich beschrieben.

Ein vereinfachtes Beispiel für Eingabedatei:

<?xml version="1.0" encoding="utf-8"?> 
    <Application> 
     <PersonApplicants> 
       <Person ApplicantType="Borrower" ApplicationType="Sole" > 
        <PersonName FirstName="Jane" Surname="Smith" /> 
        <PersonalDetails CreditHistory="CleanCredit" YearsInCurrentProfession="12"> 
         <Residency ResidencyStatus="Citizen" ResidencyCountry="Australia"/> 
        </PersonalDetails> 
       </Person> 
       <Person ApplicantType="Guarantor" ApplicationType="Sole" > 
        <PersonName FirstName="John" Surname="Smith" /> 
       </Person> 
     </PersonApplicants> 
     <CompanyApplicants> 
     <Company ApplicantType="Guarantor" ApplicationType="Joint"> 
      <CompanyName CompanyName="C1" TradingName="C1" /> 
      <BusinessDetails YearsInBusiness="19" CreditHistory="CleanCredit" /> 
     </Company> 
     </CompanyApplicants> 
    </Application> 

Führen einer Reihe einzelner Prüfungen an jedem Knoten, und Ausgabe am Ende, ob zumindest einer der Test nicht bestanden hat oder alle bestanden haben.

Ausgangsprobe xml:

<TestResult>Failed</TestResult> 

, wenn eine des Tests oder

<TestResult>Passed</TestResult> 

nicht bestanden, wenn alle Tests bestanden.

Dies ist ein Beispiel dessen, was ich zu tun versuchte:

<?xml version="1.0"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
    <xsl:output method="xml" encoding="utf-8" indent="yes"/> 
    <xsl:strip-space elements="*" /> 
    <xsl:template match="/"> 
     <TestResult> 
      <xsl:variable name="fail_test"> 
       <xsl:apply-templates select="Application" /> 
      </xsl:variable> 
       <xsl:choose> 
        <!-- If any rule triggers/fails, output the following value "True".--> 
        <xsl:when test="$fail_test">True</xsl:when> 
        <!-- Otherwise putput the following value "False"--> 
        <xsl:otherwise>False</xsl:otherwise> 
       </xsl:choose> 
     </TestResult> 
    </xsl:template> 
    <xsl:template match="Application"> 
     <xsl:apply-templates select="PersonApplicants"/> 
     <xsl:apply-templates select="CompanyApplicants"/> 
    </xsl:template> 
    <xsl:template match="PersonApplicants"> 
    <!-- Test Rule 1 Have at least one Borrower, Person or Company. --> 
    <xsl:variable name="var1"> 
     <xsl:choose> 
      <xsl:when test="//Person/@ApplicantType='Borrower' or //Company/@ApplicantType='Borrower'"><xsl:copy-of select="true()" /></xsl:when> 
      <xsl:otherwise><xsl:copy-of select="false()" /></xsl:otherwise> 
     </xsl:choose> 
    </xsl:variable> 
    <!-- Test Rule 2 Only one applicant allowed for a Sole application, Person or Company. --> 
    <xsl:variable name="var2"> 
     <xsl:choose> 
      <xsl:when test="Person/@ApplicationType='Sole'"> 
       <xsl:choose> 
        <xsl:when test="count(//Person) + count(//Company) = 1"><xsl:copy-of select="true()" /></xsl:when> 
        <xsl:otherwise><xsl:copy-of select="false()" /></xsl:otherwise> 
       </xsl:choose> 
      </xsl:when> 
      <xsl:otherwise><xsl:copy-of select="true()" /></xsl:otherwise> 
     </xsl:choose> 
    </xsl:variable> 
<!-- need a way to handle the results on all Person nodes --> 
<!-- this is only in here as a placeholder for the correct code --> 
     <!-- Test child nodes of Person Applicants, i.e Person nodes. --> 
     <xsl:for-each select="Person"> 
      <xsl:apply-templates select="."/> 
     </xsl:for-each> 
<!--******************************************************************--> 
      <!--the returned value of the template--> 
     <xsl:copy-of select="not($var1 and $var2)" /> 
<!--******************************************************************--> 
    </xsl:template> 

<xsl:template match="Person"> 
<!-- @ApplicantType LIXI 2.0 node Validation: is required --> 
<xsl:variable name="var1"> 
    <xsl:choose> 
     <xsl:when test="not (@ApplicantType) or string(@ApplicantType) =''"><xsl:copy-of select="true()" /></xsl:when> 
     <xsl:otherwise><xsl:copy-of select="false()" /></xsl:otherwise> 
    </xsl:choose> 
</xsl:variable> 


<!-- @PrimaryApplicant LIXI 2.0 node Validation: PrimaryApplicant is required when Applicant Type is Borrower --> 
<xsl:variable name="var2"> 
    <xsl:choose> 
     <xsl:when test="not (@PrimaryApplicant) or string(@PrimaryApplicant) =''"> 
      <xsl:choose> 
       <xsl:when test="@ApplicantType='Borrower'"><xsl:copy-of select="true()" /></xsl:when> 
       <xsl:otherwise><xsl:copy-of select="false()" /></xsl:otherwise> 
      </xsl:choose> 
     </xsl:when> 
     <xsl:otherwise><xsl:copy-of select="true()" /></xsl:otherwise> 
    </xsl:choose> 


     <!--the returned value of the template--> 
    <xsl:copy-of select="not($var1 and $var2)" /> 
<!--******************************************************************--> 
</xsl:template> 

</xsl:stylesheet> 

Antwort

0

Simplest, von wo aus Sie

das Ende Ihrer Test sylesheet nicht gut wäre sind gebildet
<xsl:template match="/"> 
    <TestResult> 
     <xsl:variable name="fail_test"> 
      <xsl:apply-templates select="Application" /> 
     </xsl:variable> 
     <xsl:choose> 
     <xsl:when test="contains($fail_test,'false')" >Failed</xsl:when> 
    <xsl:otherwise>Passed</xsl:otherwise> 
    </xsl:choose> 
    </TestResult> 
</xsl:template> 

Hinweis ist und /xsl:if sollte /xsl:choose sein

+0

Danke, aber die Frage war, wie bekomme ich den Variablenwert richtig, nicht, wie ich die Variable einmal testen würde ich es haben. Korrigiert den Fehler, ta. – crismicu

+0

Wenn Sie das Stylesheet so ändern, wie ich es vorschlage, gibt es das von Ihnen gewünschte Ergebnis; Zurückkehren fehlgeschlagen, wenn ein einzelner Test fehlgeschlagen ist, und bestanden, wenn alle bestanden wurden. Inwiefern unterscheidet sich das von Ihrer ursprünglichen Frage? –

+0

Verstanden, was du jetzt meintest; Ich beginne, oben einen booleschen Wert zu erhalten und dies zu testen, nicht eine Zeichenkette, die die Ergebnisse aller Tests enthält. Vielen Dank – crismicu

Verwandte Themen