2011-01-06 10 views
0

Ich habe eine EingabedateiMerging differnent Vorlagen in eine generische Vorlage

main.xml

<?xml version="1.0" encoding="utf-8" ?> 
<Employees> 
<Employee> 
<id name="id">1</id> 
<firstname >ABC</firstname> 
<lastname >XYZ</lastname> 
<age >32</age> 
</Employee> 
</Employees> 

und 2 Lookup-Dateien:

Lookup1.xml

<?xml version="1.0" encoding="utf-8"?> 
    <Employees> 
    <Employee id="1"> 
    <department code="102">HR</department> 
    </Employee> 
    </Employees> 

Lookup2. xml

<?xml version="1.0" encoding="utf-8"?> 
    <Employees> 
    <Employee id="1"> 
    <Country code="10">Canada</Country> 
    </Employee> 
    </Employees> 

möchte ich eine ouput insuch einer Weise, dass ich ein Komma geben seprated Werte Skripte zB „Land, Abteilung“ und es sollte die folgende Ausgabe

<?xml version="1.0" encoding="utf-8" ?> 
    <Employees> 
    <Employee> 
    <id name="id">1</id> 
    <firstname >ABC</firstname> 
    <lastname >XYZ</lastname> 
    <age >32</age> 
    <va-object> 
    <va-metadata> 
    <related-content-ref area="decisions" 
     cite="102" 
     relationship="department" relevance="100"/> 
    <primary-class> 
     <super-class super-class="value-add"/> 
     <sub-class sub-class="department">HR</sub-class> 
    </primary-class> 
    </va-metadata> 
</va-object> 
<va-object> 
    <va-metadata> 
    <related-content-ref area="decisions" 
     cite="10" 
     relationship="country" relevance="100"/> 
    <primary-class> 
     <super-class super-class="value-add"/> 
     <sub-class sub-class="country">Canada</sub-class> 
    </primary-class> 
    </va-metadata> 
</va-object> 
    </Employee> 
    </Employees> 

erzeugen Aber wenn ich Pass nur „Land“ als Parameter Dann sollte das Skript keine Abteilung einfügen oder umgekehrt. Ich kann dies erreichen, indem ich 2 verschiedene Länder und Abteilungen tempelt habe, aber ich möchte, dass dies erreicht wird, indem eine generische Vorlage mit Parametern aus einer externen Datei verwendet wird. Jede Hilfe wird geschätzt.

+0

Ich schlage vor, Sie reduzieren Dies ist ein minimaler Satz gültiger xsl, der demonstriert, was Sie erreichen möchten, und Beispiel-XML-Eingabe und -Ausgabe bereitstellen. Niemand wird versuchen, 100 Zeilen komplexer xsl ohne XML-Kontext zu verstehen. –

+0

@atif: Ihr Endziel kann erreicht werden, aber nicht so, wie Sie es möchten. Wie @Jim Garrison vorschlagen, geben Sie ein Eingabe-Beispiel und ein einfacheres Stylesheet-Fragment an. –

+0

Danke Jungs, ich werde in einfaches Format konvertieren, aber können Sie mir schnell sagen, ob wir den "xpath Ausdruck" aus einer externen Datei auswählen können, während die Variablenwerte zuweisen? – atif

Antwort

0

Dieses Sheet:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:key name="kElemByParentId" match="Employee/*" use="../@id"/> 
    <xsl:param name="pNames" select="'Country department'"/> 
    <xsl:variable name="vNames" select="concat(' ',$pNames,' ')"/> 
    <xsl:variable name="vLookup" select="document('Lookup1.xml')| 
             document('Lookup2.xml')"/> 
    <xsl:variable name="vUpper" select="'QWERTYUIOPASDFGHJKLZXCVBNM'"/> 
    <xsl:variable name="vLower" select="'qwertyuiopasdfghjklzxcvbnm'"/> 
    <xsl:template match="node()|@*" name="identity"> 
     <xsl:copy> 
      <xsl:apply-templates select="node()|@*"/> 
     </xsl:copy> 
    </xsl:template> 
    <xsl:template match="Employee/*[last()]"> 
     <xsl:variable name="vKey" select="../id"/> 
     <xsl:call-template name="identity"/> 
     <xsl:for-each select="$vLookup"> 
      <xsl:apply-templates select="key('kElemByParentId',$vKey) 
              [contains($vNames, 
                concat(' ',name(),' '))]" 
           mode="va-object"/> 
     </xsl:for-each> 
    </xsl:template> 
    <xsl:template match="*" mode="va-object"> 
     <xsl:variable name="vName" 
         select="translate(name(),$vUpper,$vLower)"/> 
     <va-object> 
      <va-metadata> 
       <related-content-ref area="decisions" 
            cite="{@code}" 
            relationship="{$vName}" 
            relevance="100"/> 
       <primary-class> 
        <super-class super-class="value-add"/> 
        <sub-class sub-class="{$vName}"> 
         <xsl:value-of select="."/> 
        </sub-class> 
       </primary-class> 
      </va-metadata> 
     </va-object> 
    </xsl:template> 
</xsl:stylesheet> 

Ausgang:

<Employees> 
    <Employee> 
     <id name="id">1</id> 
     <firstname>ABC</firstname> 
     <lastname>XYZ</lastname> 
     <age>32</age> 
     <va-object> 
      <va-metadata> 
       <related-content-ref area="decisions" 
            cite="102" 
            relationship="department" 
            relevance="100" /> 
       <primary-class> 
        <super-class super-class="value-add" /> 
        <sub-class sub-class="department">HR</sub-class> 
       </primary-class> 
      </va-metadata> 
     </va-object> 
     <va-object> 
      <va-metadata> 
       <related-content-ref area="decisions" 
            cite="10" 
            relationship="country" 
            relevance="100" /> 
       <primary-class> 
        <super-class super-class="value-add" /> 
        <sub-class sub-class="country">Canada</sub-class> 
       </primary-class> 
      </va-metadata> 
     </va-object> 
    </Employee> 
</Employees> 

Hinweis: "Ist in sequence" XPath 1.0 Test:

contains(concat($separator,$sequence,$separator), 
     concat($separator,$item,$separator)) 
Verwandte Themen