1

スティッキー対応のクラスを持つテーブルのコンテンツを XML 形式で取得しようとしています。

私のPHPコードは次のとおりです。

<?php

// Load the XML source
$xml = new DOMDocument;
$out = $xml->load("collection.html");

$xsl = new DOMDocument;
$xsl->load('collection.xsl');

// Configure the transformer
$proc = new XSLTProcessor;
$proc->importStyleSheet($xsl); // attach the xsl rules

$xml = $proc->transformToXML($xml);

$xml = simplexml_load_string($xml);

print_r($xml);

?>

また、collection.html HTML は次のとおりです。

<table>
    <thead>
        <tr>
            <th>A</th>
        </tr>
        <tbody>
        <tr>
            <td>B</td>
        </tr>
        </tbody>
    </thead>
</table>

<table class="sticky-enabled">
 <thead><tr><th>Date</th><th>Time</th><th>Location</th><th>Tracking Event</th> </tr></thead>
<tbody>
 <tr class="odd"><td>16-04-2013</td><td>19:20</td><td>International Hub</td><td>Forwarded for export</td> </tr>
 <tr class="even"><td>16-04-2013</td><td>18:53</td><td>International Hub</td><td>Received and processed</td> </tr>
 <tr class="odd"><td>15-04-2013</td><td>17:28</td><td>Manchester Piccadilly Depot</td><td>Collected from customer</td> </tr>
 <tr class="even"><td>15-04-2013</td><td>00:00</td><td>WDM Online</td><td></td> </tr>
</tbody>
</table>

<table>
    <thead>
        <tr>
            <th>A</th>
        </tr>
        <tbody>
        <tr>
            <td>B</td>
        </tr>
        </tbody>
    </thead>
</table>

最後に、collection.xsl は次のとおりです。

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:template match="/">
  <output>
    <xsl:for-each select="table[@class='sticky-enabled']/tbody/tr">
      <tracking>
        <date><xsl:value-of select="td[1]" /></date>
        <time><xsl:value-of select="td[2]" /></time>
        <event><xsl:value-of select="td[3]" /></event>
        <extra><xsl:value-of select="td[4]" /></extra>        
      </tracking> 
    </xsl:for-each>
  </output>    
  </xsl:template>
</xsl:stylesheet>

これを実行すると、$xml は空になります。collection.html を編集して最初と最後のテーブルを削除すると (つまり、アクセスしようとしているテーブルをそのままにしておくと)、機能します。したがって、問題は次のとおりであると思われます。

<xsl:for-each select="table[@class='sticky-enabled']/tbody/tr">
4

1 に答える 1

0

あなたの「XML」は整形式ではありません。そのため、XSLT で解析および変換することはできません。XML ドキュメントには、単一のドキュメント要素が必要です。兄弟である3 つの<table>要素があります。他のテーブルを削除すると、変換可能な整形式の XML ファイルになります。

テーブルを XML 要素でラップしてみてください。

例えば:

<doc>
  <table>
    <thead>
        <tr>
            <th>A</th>
        </tr>
        <tbody>
        <tr>
            <td>B</td>
        </tr>
        </tbody>
    </thead>
</table>

<table class="sticky-enabled">
 <thead><tr><th>Date</th><th>Time</th><th>Location</th><th>Tracking Event</th> </tr></thead>
<tbody>
 <tr class="odd"><td>16-04-2013</td><td>19:20</td><td>International Hub</td><td>Forwarded for export</td> </tr>
 <tr class="even"><td>16-04-2013</td><td>18:53</td><td>International Hub</td><td>Received and processed</td> </tr>
 <tr class="odd"><td>15-04-2013</td><td>17:28</td><td>Manchester Piccadilly Depot</td><td>Collected from customer</td> </tr>
 <tr class="even"><td>15-04-2013</td><td>00:00</td><td>WDM Online</td><td></td> </tr>
</tbody>
</table>

<table>
    <thead>
        <tr>
            <th>A</th>
        </tr>
        <tbody>
        <tr>
            <td>B</td>
        </tr>
        </tbody>
    </thead>
  </table>
<doc>

次に、スタイルシートを調整して構造の変更を考慮し、ルート ノードではなくドキュメント要素に一致させます。

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output indent="yes"/>
        <output>
            <xsl:for-each select="table[@class='sticky-enabled']/tbody/tr">
                <tracking>
                    <date><xsl:value-of select="td[1]" /></date>
                    <time><xsl:value-of select="td[2]" /></time>
                    <event><xsl:value-of select="td[3]" /></event>
                    <extra><xsl:value-of select="td[4]" /></extra>        
                </tracking> 
            </xsl:for-each>
        </output>    
    </xsl:template>
</xsl:stylesheet>
于 2013-04-17T00:20:57.040 に答える