2016-10-16 2 views
0

ich eine HTML-Datei in eine XML-Datei mit Hilfe von XSLT zur Transformation bekam, wo ich brauche nur das erste Kind Knotens Datumswert zu ergreifen, um in dem letzten Kindknoten verwendet werden, da die Die letzten untergeordneten Knoten haben keine Datenwerte und die Tags werden leer angezeigt. Ich habe versucht, die Positionierung für das XSLT zu verwenden, aber ohne Erfolg.XSLT ersten Kind Knotenwert in späterem Kind verwenden Knoten

Der entsprechende HTML-Code ist:

<tbody> 
    <tr> 
    <th rowspan="8" scope="rowgroup">2005DEC</th> 
    <th scope="row">Blemish on Card</th> 

    </tr> 

    <tr> 
    <th scope="row">Damaged</th> 

    </tr> 

    <tr> 
    <th rowspan="8" scope="rowgroup">2006JAN</th> 
    <th scope="row">Lost</th> 

    </tr> 

    <tr> 
    <th scope="row">Stolen</th> 

    </tr> 
</tbody> 

Der entsprechende XSLT-Code ist:

<xsl:for-each select="html/body/div/div/div/table/tbody/tr"> 
    <Entry> 
     <xsl:choose> 
      <xsl:when test="th[@scope='rowgroup']"> 
       <Year> 
        <xsl:value-of select="substring(th[@scope='rowgroup']/., 1, 4)" /> 
       </Year> 
       <Month> 
        <xsl:value-of select="substring(th[@scope='rowgroup']/., 5, 3)" /> 
       </Month> 
      </xsl:when> 
      <xsl:otherwise> 
       <Year> 
        <xsl:value-of select="substring(tr[1]/th[@scope='rowgroup']/., 1, 4)" /> 
       </Year> 
       <Month> 
        <xsl:value-of select="substring(tr[1]/th[@scope='rowgroup']/., 5, 3)" /> 
       </Month> 
      </xsl:otherwise> 
     </xsl:choose> 
    </Entry> 
</xsl:for-each> 

Der XML-Code, der ausgegeben wird, ist die folgende, das ist nicht das, was ich als zweites Kind wollen Knoten hat nicht den Datumswert des ersten untergeordneten Knotens und wird nur als leeres Wert-Tag für Jahr und Monat angezeigt:

Was ich brauche, ist:

<Entry> 
    <Year>2005</Year> 
    <Month>DEC</Month> 
    <Reason>Blemish on Card</Reason> 
</Entry> 
<Entry> 
    <Year>2005</Year> 
    <Month>DEC</Month> 
    <Reason>Damaged</Reason> 
</Entry> 
<Entry> 
    <Year>2006</Year> 
    <Month>JAN</Month> 
    <Reason>Lost</Reason> 
</Entry> 
<Entry> 
    <Year>2006</Year> 
    <Month>JAN</Month> 
    <Reason>Stolen</Reason> 
</Entry> 

Wie mache ich das für meine XSLT?

Antwort

1

Sie müssen sich Ebene hoch: substring(../tr[1]/th[@scope='rowgroup']/., 1, 4) wenn Sie die Daten aus der ersten Reihe auswählen möchten.

Basierend auf Ihren Kommentaren, die nicht das, was Sie wollen, wenn Sie die Daten aus der ersten vorhergehenden Geschwisterreihe mit einem scope="rowgroup" Attribute auswählen mögen dann eine Möglichkeit, mit Ihrem Ansatz fort ist

<xsl:for-each select="//tbody/tr"> 
    <Entry> 
     <xsl:choose> 
      <xsl:when test="th[@scope='rowgroup']"> 
       <Year> 
        <xsl:value-of select="substring(th[@scope='rowgroup']/., 1, 4)" /> 
       </Year> 
       <Month> 
        <xsl:value-of select="substring(th[@scope='rowgroup']/., 5, 3)" /> 
       </Month> 
      </xsl:when> 
      <xsl:otherwise> 
       <Year> 
        <xsl:value-of select="substring(preceding-sibling::tr[th[@scope='rowgroup']][1]/th[@scope='rowgroup'], 1, 4)" /> 
       </Year> 
       <Month> 
        <xsl:value-of select="substring(preceding-sibling::tr[th[@scope='rowgroup']][1]/th[@scope='rowgroup'], 5, 3)" /> 
       </Month> 
      </xsl:otherwise> 
     </xsl:choose> 

     <xsl:for-each select="th[@scope='row']"> 
      <Reason> 
       <xsl:value-of select="." /> 
      </Reason> 
     </xsl:for-each> 
    </Entry> 
</xsl:for-each> 

obwohl ich möglicherweise einfacher zu verwenden for-each-group group-starting-with="tr[th[@scope = 'rowgroup']]", wenn Sie einen XSLT 2.0-Prozessor verwenden.

+0

Das funktioniert aber es wird die foreach beeinflussen. Coz die Foreach Ziele mehrere Zeitperioden, aber jetzt, obwohl die letzten Kind-Knoten in jedem foreach die Werte des ersten Kind Knoten erfassen, aber sie nur die Werte des ersten Kind-Knoten von der ersten foreach. – iteong

+0

Sie haben nur eine einzige Tabelle und eine einzige für jeden angezeigt, daher kann ich leider nicht sagen, auf was sich Ihr Kommentar bezieht. Wenn das Problem nicht gelöst ist, dann bearbeiten Sie die Frage und zeigen Sie die notwendigen Details der Eingabe, XSLT, die Sie haben und die gewünschte Ausgabe und die Sie erhalten. –

+0

Does mit 'substring (../ preceding-sibling :: tr [@ scope = 'rowgroup'] [1]/th [@ scope = 'rowgroup'] /., 1, 4)' geben Sie das gewünschte Ergebnis ? Ich bin mir momentan nicht sicher, wie Sie die Zeile mit dem entsprechenden Wert identifizieren möchten. –