2017-06-21 3 views
0

xml

<?xml version='1.0' encoding='UTF-8'?> 
    <folder> 
    <document> 
      <h1>Harry Potter</h1> 
      <h2>j.rowling</h2> 
      <subheading>book</subheading> 
     </document> 
     <document> 
      <p type="num"> 
       <num>55</num>   
      </p> 
      <h1>Hi-Tech</h1> 
     </document> 
    </folder> 

Ich kann es nicht tun:Wie Xslt zu transformieren -> html für die dieses Dokument

  1. Wenn die Reihenfolge der Elemente h1, h2, Stelle gefunden wird, dann h1 und Unterüberschrift in einer Zeile anzeigen und dann das Element h2 ausgeben;

NOW:

<document> 
     <h1>Harry Potter</h1> 
     <h2>j.rowling</h2> 
     <subheading>book</subheading> 
    </document> 

SOLL:

<div class="document"> 
     <h1 style="display:inline-block">Harry Potter book </h1> 
     <h5 style="display:inline-block">book</h5> 
     <br/> 
     <h2>j.rowling</h2> 
    </div> 

  1. Wenn vor dem h1-Elemente gibt es ein Element "p" mit das Attribut type = "num", innerhalb dessen sich kein leeres Element num befindet - zeige es in einer Zeile mit dem Element h1 an.
+0

Einige Vorschläge: (a) zeigen Sie uns Ihre besten Bemühungen bisher. Das sagt uns viel darüber, wo Sie stecken bleiben und zeigt, dass Sie sich anstrengen. (b) illustriere die Transformationsregeln in deiner Frage mit konkreten Beispielen: Wenn die Eingabe X ist, sollte die Ausgabe Y sein. –

+0

@ Michael Kay, ich verstehe nicht, wie die Achse benutzt wird. Es tut uns leid. – vvator

+0

Wenn Sie eine Antwort wünschen, folgen Sie bitte meinen obigen Vorschlägen. –

Antwort

1

die erste Anforderung zuerst machen, wenn Sie wissen, dass die Eingabe die Sequenz (h1, h2, Stelle), dann ist es leicht mit dieser Logik getan:

<xsl:template match="document"> 
    <div class="document"> 
    <xsl:apply-templates select="h1"/> 
    <xsl:apply-templates select="subheading"/> 
    <br/> 
    <xsl:apply-templates select="h2"/> 
    </div> 
</xsl:template> 

<xsl:template match="h1"/> 
    <h1 style="display:inline-block"><xsl:value-of select="."/></h1> 
</xsl:template> 

<xsl:template match="h2"/> 
    <h2><xsl:value-of select="."/></h2> 
</xsl:template> 

<xsl:template match="subheading"/> 
    <h5 style="display:inline-block"><xsl:value-of select="."/></h5> 
</xsl:template> 

Doch dann stellt sich die Frage: Was wenn es nicht in diesem Format ist? Leider haben Sie uns nicht gesagt, welche anderen Formate möglich sind und was Sie generieren möchten, wenn sie auftreten. Wir können das also ohne weitere Informationen nicht wirklich fortsetzen.

Die zweite Regel kann in XSLT als

<xsl:template match="h1[preceding-sibling::*[1][self::p/@num][not(child::num)]"> 
    <h1> 
    <xsl:value-of select="preceding-sibling::*[1][self::p/@num]/@num"/> 
    <xsl:value-of select="."/> 
    </h1> 
</xsl:template> 
+0

thanx. Ich habe in meiner Lösung Ihre Idee für das Matching mit einigen Änderungen verwendet – vvator

0

ich tat es übersetzt werden!

Meine Lösung auf und Betreiber basierend

* MEINE ARBEIT LÖSUNG: *

<xsl:template match="document[h1 and h2 and subheading]"> 
    <xsl:value-of select="concat(h1,' ',subheading)"/> 
    <br/> 
    <xsl:value-of select="h2"/> 
</xsl:template> 

<xsl:template match="document[p[@type='num'][num] and h1]"> 
    <xsl:value-of select="concat(h1,' ',p)"/> 
</xsl:template> 
Verwandte Themen