2016-05-11 3 views
0

Bei den folgenden XML-Eingänge: file1:Nehmen Vorlagen nicht wie gewünscht funktioniert

<?xml version="1.0" encoding="UTF-8"?> 


<File1 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 

    <code code="file1_code" displayName="file1_display" codeSystem="file1_cs" codeSystemName="file1_csn"/> 

    <title>Title of file1</title> 
    <component typeCode="COMP"> 
     <structuredBody classCode="DOCBODY"> 
      <component typeCode="COMP"> 
       <section> 
        <templateId root="someRoot_file1" assigningAuthorityName="someAuhthority_file1"/> 
        <code code="file1-sec1_code" displayName="file1_sec1_display" codeSystem="file1_sec1_cs" codeSystemName="file1_sec1_csn"/> 
        <title>Tile of sec 1 from file1</title> 
        <text> 
         <content styleCode="Italics"> 
          Text of sec 1 from file1 
         </content> 
        </text>    
        <entry> file 1 sec 1      
        </entry> 
       </section> 
      </component> 
      <component typeCode="COMP"> 
       <section classCode="DOCSECT">     
        <code code="file1_sec2_code" codeSystem="file2_sec2_cs" displayName="file2_sec2_display" codeSystemName="file2_sec2_csn"/> 
        <title>Tile from sec 2 file 1</title> 
        <text> 
         <content styleCode="Italics"> 
          Text from file1 sec 2 
         </content> 
        </text> 
        <entry typeCode="test"> file2 sec 2 
        </entry> 
       </section> 
      </component> 
     </structuredBody> 
    </component> 
</File1> 

file2:

<?xml version="1.0"?> 
<A> 
<title value="Title of file2"/> 
    <text> 
     <status value="generated"/> 
     <div xmlns="http://www.w3.org/1999/xhtml"> 
      <p>File 2 Text</p>   
     </div> 
    </text> 
    <section> 
     <code> 
      <coding> 
       <system value="sec 1 file2 sys"/> 
       <code value="sec 1 file 2 code"/> 
       <display value="sec 1 file 2 display"/> 
      </coding> 
     </code> 
     <title>Title of sec 1 file2</title> 
     <text> 
      <content styleCode="Italics">Section 1 Text 
      </content> 
     </text>   
     <entry> 
      <someEntry>     
      </someEntry> 
     </entry> 
    </section> 
    <section> 
     <code> 
      <coding> 
       <system value="sec 2 file2 sys"/> 
       <code value="sec 2 file 2 code"/> 
       <display value="sec 2 file 2 display"/> 
      </coding> 
     </code> 
     <title>Title of sec 2 file2</title> 
     <text> 
      <content styleCode="Italics">Section 2 file2 Text 
      </content> 
     </text>   
     <entry> 
      <someEntry> entry sec 2 file 2    
      </someEntry> 
     </entry> 
    </section> 

</A> 

und die folgende Xslt:

<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
     <xsl:output method="xml" indent="yes"/> 

     <xsl:strip-space elements="*" /> 

     <xsl:variable name="input" select="/" /> 

     <xsl:template match="@*|node()"> 
      <xsl:copy> 
       <xsl:apply-templates select="@*|node()"/> 
      </xsl:copy> 
     </xsl:template> 

     <xsl:template match="/"> 
      <Bundle> 
       <id value="test"/>   
       <type value="document"/> 
       <entry>    
        <resource>     
         <xsl:apply-templates select="document('file2.xml')/*"/>    
        </resource> 
       </entry> 
      </Bundle> 
     </xsl:template> 


     <xsl:template match="text"> 
      <text> 
       <status value="generated"/> 
       <div xmlns="http://www.w3.org/1999/xhtml"> 
        <p>This is the text from the stylesheet </p>     
       </div> 
      </text> 
     </xsl:template> 

     <xsl:template match="title"> 
      <xsl:apply-templates select="$input/File1/title"/> 
     </xsl:template> 

     <xsl:template match="section[1]"> 
      <xsl:apply-templates select="$input/File1/component/structuredBody/component/section"/> 
     </xsl:template> 

     <xsl:template match="section[2]"/>  

     <xsl:template match="File1/title"> 
      <title> 
       <xsl:attribute name="value"> 
        <xsl:value-of select="." /> 
       </xsl:attribute> 
      </title> 
     </xsl:template> 

     <xsl:template match = "File1/component/structuredBody/component/section">  
      <section> 
       <xsl:apply-templates/> 
      </section> 
     </xsl:template> 


    </xsl:stylesheet> 

Und das ist die Ausgabe:

<?xml version="1.0" encoding="UTF-8"?> 
<Bundle> 
    <id value="test"/> 
    <type value="document"/> 
    <entry> 
     <resource> 
      <A> 
       <title value="Title of file1"/> 
       <text> 
        <status value="generated"/> 
        <div xmlns="http://www.w3.org/1999/xhtml"> 
         <p>This is the text from the stylesheet </p> 
        </div> 
       </text> 
       <section> 
        <templateId xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" root="someRoot_file1" assigningAuthorityName="someAuhthority_file1"/> 
        <code xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" code="file1-sec1_code" displayName="file1_sec1_display" codeSystem="file1_sec1_cs" codeSystemName="file1_sec1_csn"/> 
        <title value="Title of file1"/> 
        <text> 
         <status value="generated"/> 
         <div xmlns="http://www.w3.org/1999/xhtml"> 
          <p>This is the text from the stylesheet </p> 
         </div> 
        </text> 
        <entry xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"/> 
       </section> 
       <section> 
        <code xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" code="file1_sec2_code" codeSystem="file2_sec2_cs" displayName="file2_sec2_display" codeSystemName="file2_sec2_csn"/> 
        <title value="Title of file1"/> 
        <text> 
         <status value="generated"/> 
         <div xmlns="http://www.w3.org/1999/xhtml"> 
          <p>This is the text from the stylesheet </p> 
         </div> 
        </text> 
        <entry xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" typeCode="test"/> 
       </section> 
      </A> 
     </resource> 
    </entry> 
</Bundle> 

Und dies ist die erwartete Ausgabe:

<?xml version="1.0" encoding="UTF-8"?> 
<Bundle> 
    <id value="test"/> 
    <type value="document"/> 
    <entry> 
     <resource> 
      <A> 
       <title value="Title of file1"/> 
       <text> 
        <status value="generated"/> 
        <div xmlns="http://www.w3.org/1999/xhtml"> 
         <p>This is the text from the stylesheet </p> 
        </div> 
       </text>    
       <section> 
        <templateId xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" root="someRoot_file1" assigningAuthorityName="someAuhthority_file1"/> 
        <code xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" code="file1-sec1_code" displayName="file1_sec1_display" codeSystem="file1_sec1_cs" codeSystemName="file1_sec1_csn"/> 
        <title>Tile of sec 1 from file1</title> 
        <text> 
         <content styleCode="Italics"> 
          Text of sec 1 from file1 
         </content> 
        </text>    
        <entry xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"/> 
       </section> 
       <section> 
        <code xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" code="file1_sec2_code" codeSystem="file2_sec2_cs" displayName="file2_sec2_display" codeSystemName="file2_sec2_csn"/> 
        <title>Tile from sec 2 file 1</title> 
         <text> 
          <content styleCode="Italics"> 
           Text from file1 sec 2 
          </content> 
         </text> 
        <entry xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" typeCode="test"/> 
       </section> 
      </A> 
     </resource> 
    </entry> 
</Bundle> 

Ich habe folgende Fragen:

  1. Warum ist der Titel im Abschnitt Elementen aus dem Haupttitel kommen (d File1/title) wenn die Apply-Vorlagen innerhalb von File1/component/structuredBody/component/section liegen? Ich habe erwartet, dass der Titel der Sektion ausgegeben wird, was gewünscht ist. Noch verwirrender ist, dass es tatsächlich die Elemente im Abschnitt wie Code, Eintrag usw. ausgibt, aber Titel und Text (siehe q2 unten) scheinen anders behandelt zu werden und ich kann nicht für das Leben von mir verstehen, warum.

  2. Gleiches mit Text. Warum wird der Text für den Abschnitt nicht ausgegeben?

Hier ist mein vermutlich falsche Verständnis des Prozesses:

Wir beginnen mit den <xsl:template match="/"> und erstellen Elemente Bundle, ID usw. und dann <xsl:apply-templates select="document('file2.xml')/*"/> verwenden wir passen das oberste Element von file2 (A) und seit Wir haben keine Vorlage, die mit dieser übereinstimmt, die Identitätsvorlage wird aufgerufen, kopiert sie und verarbeitet ihre untergeordneten Elemente, die Text, Titel und Abschnitt sind. Für jedes dieser untergeordneten Elemente sucht es nach einer passenden Vorlage. es findet sie und bringt sie zusammen.

Für Elementabschnitt jedoch passt es nur den ersten Abschnitt Element wegen <xsl:template match="section[1]"> und dann wegen <xsl:apply-templates select="$input/File1/component/structuredBody/component/section"/> in der Vorlage, sieht es für eine Vorlage Kinder Abschnitt in File1 Anpassung, die Code sind, Text, Titel und templateId. Es findet keine solche explizit definierte Vorlage, also ruft sie die Identitätsvorlagen für sie auf, kopiert und verarbeitet sie bis zum Ende. Zumindest verstehe ich das.

+0

IMHO, Ihr XSLT benötigt eine Neuschreibung. Ich konnte kaum verstehen, was es tut, aber sicher nicht, was es bedeutet * zu tun. –

+0

Ich versuche, einige Elemente aus Datei1 und Datei2 zuzuordnen. Einige der Elemente in Datei1 sind identisch mit denen in Datei2 und werden daher nur kopiert. Andere müssen sich ändern und so weiter. Gleiches gilt für Datei1. Einige seiner Elemente werden unverändert kopiert und bleiben unverändert. Andere jedoch müssen möglicherweise modifiziert und/oder durch Teile/Abschnitte von Datei2 ersetzt werden. – Enigma

+0

Ich fürchte, das bedeutet mir nicht viel. Was hier helfen könnte, ist die erwartete Ausgabe zu sehen. Und ich würde auch mit etwas einfacherem beginnen und dann noch mehr Komplexität hinzufügen. –

Antwort

1

Warum wird der Titel in dem Abschnitt Elementen aus dem Haupttitel kommenden

Da jederzeit die Prozessor-Vorlagen angewiesen wird, auf ein title anzuwenden, sieht es für die am besten passende Vorlage anwenden, und findet diese:

<xsl:template match="title"> 
    <xsl:apply-templates select="$input/File1/title"/> 
</xsl:template> 

Dies ändert den Kontext der title in file1.xml, und das am besten passende Vorlage für diese ist:

<xsl:template match="File1/title"> 
    <title> 
     <xsl:attribute name="value"> 
      <xsl:value-of select="." /> 
     </xsl:attribute> 
    </title> 
</xsl:template> 

und das ist das Ergebnis, das Sie sehen.


Same mit Text. Warum wird der Text für den Abschnitt nicht ausgegeben?

- als Antwort auf die folgende Klarstellung bearbeitet: -

Wenn ich sage, Text spreche ich über Textelemente nur.

Das ursprüngliche text Element (Kind von section in file1.xml) ausgegeben wird, nicht weil Sie eine bestimmte Vorlage haben es passend und sonst stattdessen etwas ausgibt:

<xsl:template match="text"> 
    <text> 
     <status value="generated"/> 
     <div xmlns="http://www.w3.org/1999/xhtml"> 
      <p>This is the text from the stylesheet </p>     
     </div> 
    </text> 
</xsl:template> 
+0

Ja, aber ich verstehe es nicht. Die Apply-Vorlage wird innerhalb von '" File1/component/structuredBody/component/section "' aufgerufen. Und wenn die beste Übereinstimmung in diesem Fall 'match = title' ist, sollte das gleiche für 'match = code' gelten, aber für Code (Ich habe die Code-Vorlage nicht hinzugefügt, aber Sie können einfach einen Code hinzufügen und testen und Sie werde sehen, was ich meine), aber für Code ignoriert es das und gibt den Code innerhalb des Abschnitts wie gewünscht aus. Das war auch mein Verdacht am Anfang, dass es wegen '' ist, aber das ist nicht der Fall. Sie können versuchen, es zu kommentieren und sehen, das Ergebnis ist das gleiche. – Enigma

+0

Ich fürchte, Sie missverstehen, wie das [XSLT-Verarbeitungsmodell] (https://www.w3.org/TR/xslt/#section-Processing-Model) funktioniert.Ich könnte jeden Fall und jeden Fall im Detail erklären, aber das wäre sowohl zeitaufwendig als auch sinnlos - weil, wie ich bereits sagte, IMHO das Ganze neu strukturiert werden muss. –

+1

Wenn Sie "Text" sagen, bin ich mir nicht sicher, ob Sie über Textknoten oder Elementknoten mit dem Namen "text" sprechen. Aber so oder so, das Stylesheet tut genau das, was Sie ihm aufgetragen haben, und es ist schwer zu verstehen, warum Sie erwarten, dass es etwas anderes macht. Sie haben eindeutig etwas über die Sprache falsch verstanden, aber es ist nicht klar, was genau Ihr Missverständnis ist –

0

@ michael.hor257k und @ Michael Kay Ja, das war definitiv der Fall, dass ich missverstanden habe, wie xsl:apply-templates in Bezug auf den Kontext funktioniert. Ich dachte, weil ich xsl:apply-templates von innerhalb xsl:template match = "$input/File1/component/structuredBody/component/section"> anrief, dass es nur nach Match-Vorlagen sucht, die den Kindern des Abschnitts entsprechen. Mit anderen Worten, ich dachte, es wird nach Vorlagen wie “<xsl:template match=”File1/component/structuredBody/component/section/title"> suchen, aber das ist eindeutig nicht der Fall.

10 sucht einfach nach den untergeordneten Elementen und sucht dann nach einer Übereinstimmungsvorlage, unabhängig vom Kontext, aus dem sie aufgerufen wurden. Also, es wird nach Titel oder Textvorlage suchen, die übereinstimmt und wenn es sie findet, wird es ihnen entsprechen.

Die einfachste Lösung, die ich finden konnte, scheint das Problem zu lösen, einen Pfad zu den Titel- und Textvorlagen hinzuzufügen. Mit anderen Worten, anstelle von nur <xsl:template match="text"> sollte ich <xsl:template match="A/text"> haben. Gleiches für den Titel. Auf diese Weise wird xsl:apply-templates nicht angewendet <xsl:template match="A/text"> als der Titel in Abschnitt ist kein Kind von A. Also, da keine übereinstimmende explizite Vorlage definiert ist, wird die Identitätsvorlage angewendet und wird den Titel des Abschnitts wie gewünscht ausgeben.

+0

Jetzt wäre es nett, wenn ich diese Namespaces in der Ausgabe – Enigma

+0

IMHO loswerden könnte, dies bietet keine Antwort auf Ihre Frage. Was die Namespaces betrifft, schlage ich vor, dass Sie eine weitere Frage stellen - vorzugsweise mit einem einfacheren Beispiel. –

Verwandte Themen