1

Drupal にインポートできるように、XSLT を使用して Wordpress WXR ファイルをフォーマットしようとしています。

WXR ファイルをインポートする Drupal 用のモジュールを認識していますが、インポートされたデータがさまざまなコンテンツ タイプに対してインポートされ、新しく作成された Drupal に画像やその他の添付ファイルをプルするため、Feeds モジュールが提供できる柔軟性が必要です。ページ。これを念頭に置いて、標準の WordPress Migrate ではうまくいきません。

そのため、WXR 形式では、Wordpress の投稿と添付ファイルitemsがフィード内で個別に保持され、ID を使用して投稿と添付ファイルがリンクされます。添付ファイルは画像、ファイル (pdf、doc など) であり、xpath で見つかりwp:postmeta/wp:meta_key、_thumbnail_id、_wp_attached_file の値を持ちます。

私がやりたいのは、添付ファイル タイプのアイテムからさまざまなノードを取得し、それらを対応する投稿アイテム内に配置することです。ID はそれらをリンクします。

変換する xml のフラグメント... 最初の項目はpost2 番目の項目ですattachment。の

<item>
    <title>Some groovy title</title>
    <link>http://example.com/groovy-example</link>
    <wp:post_id>2050</wp:post_id>
    <wp:post_type>page</wp:post_type>
    ...
    ...
    ...
    <wp:postmeta>
        <wp:meta_key>_thumbnail_id</wp:meta_key>
        <wp:meta_value>566</wp:meta_value>
    </wp:postmeta>
</item>
...
...
...
<item>
    <title>My fantastic attachment</title>
    <link>http://www.example.com/fantastic-attachment</link>
    <wp:post_id>566</wp:post_id>
    <wp:post_type>attachment</wp:post_type>
    ...
    ...
    ...
    <wp:attachment_url>http://www.example.com/wp-content/uploads/2012/12/fantastic.jpg</wp:attachment_url>
    <wp:postmeta>
        <wp:meta_key>_wp_attached_file</wp:meta_key>
        <wp:meta_value>2012/12/fantastic.jpg</wp:meta_value>
    </wp:postmeta>
</item>

変換後、私はしたいです

<item>
    <title>Some groovy title</title>
    <link>http://example.com/groovy-example</link>
    <wp:post_id>2050</wp:post_id>
    <wp:post_type>page</wp:post_type>
    ...
    ...
    ...
    <wp:postmeta>
        <wp:meta_key>_thumbnail_id</wp:meta_key>
        <wp:meta_value>566</wp:meta_value>
        <wp:meta_url>http://www.example.com/wp-content/uploads/2012/12/fantastic.jpg</wp:attachment_url>
    </wp:postmeta>


</item>

たぶん、より良いアプローチがありますか?IDがノード間のリンクを作成する投稿と添付ファイルをマージしますか?

私は XSLT を初めて使用し、ID 変換に関するいくつかの投稿を読みましたが、それは正しい方向だと思いますが、必要なものを引き出す経験がありません。支援をいただければ幸いです。

4

1 に答える 1

0

なんとか解決策を見つけたようです。

添付ファイルを整理するために、いくつかの索引を使用しました。XML をさらに検査すると、私の要件が少し変わりました。

結果の出力を次の形式に変更しました...

<item>
    <title>Some groovy title</title>
    <link>http://example.com/groovy-example</link>
    <wp:post_id>2050</wp:post_id>
    <wp:post_type>page</wp:post_type>
    ...
    ...
    ...
    <thumbnail>
        <title>Spaner</title>
        <url>http://www.example.com/wp-content/uploads/2012/03/spanner.jpg</url>
    </thumbnail>
    <attachments>
        <attachment>
            <title>Fixing your widgets: An idiots guide</title>
            <url>http://www.example.com/wp-content/uploads/2012/12/fixiing-widgets.pdf</url>
        </attachment>
        <attachment>
            <title>Do It Yourself Trepanning</title>
            <url>http://www.example.com/wp-content/uploads/2013/04/trepanning.pdf</url>
        </attachment>
    </attachments>
</item>

したがって、次の xsl を使用すると、望ましい結果が得られました。インデックスの条件により、正しいファイルを確実に選択できました。

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:wp="http://wordpress.org/export/1.2/">

    <xsl:output indent="yes" cdata-section-elements="content"/>

    <!-- Setup indexes -->

    <!-- Index all main posts -->
    <xsl:key 
        name="mainposts" 
        match="*/item[wp:post_type[text()='post']]" 
        use="wp:post_id" />

    <!-- Index all sub posts (posts within posts)-->
    <xsl:key 
        name="subposts" 
        match="*/item[wp:post_type[text()='post'] and category[@nicename = 'documents']]" 
        use="category[@domain = 'post_tag']" />

    <!-- Index all image thumbs -->
    <xsl:key 
        name="images" 
        match="*/item[wp:post_type[text()='attachment'] and wp:postmeta/wp:meta_key[text()='_wp_attachment_metadata']]" 
        use="wp:post_parent" />

    <!-- Index all files (unable to sort members file at the moment)-->
    <xsl:key 
        name="attachments" 
        match="*/item[wp:post_type[text()='attachment'] and not(wp:postmeta/wp:meta_key = '_wp_attachment_metadata')]"
        use="wp:post_parent" />

    <xsl:key 
        name="thumbnails" 
        match="*/item[wp:post_type[text()='attachment']]" 
        use="wp:post_id" />

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

    <xsl:template match="*/item/wp:post_parent[text()= 0]">
        <wp:post_parent>
            <xsl:value-of select="." />
        </wp:post_parent>

        <xsl:for-each select="key('thumbnails', ../wp:postmeta[wp:meta_key[text()='_thumbnail_id']]/wp:meta_value)">
            <thumbnail>
                <title><xsl:value-of select="title" /></title>
                <url><xsl:value-of select="wp:attachment_url" /></url>
            </thumbnail>
        </xsl:for-each>

        <xsl:for-each select="key('subposts', ../category[@domain = 'post_tag'])">
            <attachments>

                <xsl:for-each select="key('images', wp:post_id)">
                    <file>
                        <title><xsl:value-of select="title" /></title>
                        <url><xsl:value-of select="wp:attachment_url" /></url>
                    </file>
                </xsl:for-each>

                <xsl:for-each select="key('attachments', wp:post_id)">
                    <file>
                        <title><xsl:value-of select="title" /></title>
                        <url><xsl:value-of select="wp:attachment_url" /></url>
                    </file>
                </xsl:for-each>

            </attachments>
        </xsl:for-each>

    </xsl:template>
于 2013-08-16T07:02:54.010 に答える