XSLT格式化Wordpress WXR XML,以便通过提要导入Drupal
我正在尝试使用XSLT格式化Wordpress WXR文件,以便将其导入Drupal 我知道Drupal模块将导入WXR文件,但我需要Feed模块能够提供的灵活性,因为导入的数据将针对不同的内容类型导入,我将把图像和其他附件拉到新创建的Drupal页面中。考虑到这一点,标准的WordPress迁移将无法解决这一问题 因此,WXR格式在提要中将Wordpress帖子和附件作为单独的XSLT格式化Wordpress WXR XML,以便通过提要导入Drupal,wordpress,xslt,drupal,Wordpress,Xslt,Drupal,我正在尝试使用XSLT格式化Wordpress WXR文件,以便将其导入Drupal 我知道Drupal模块将导入WXR文件,但我需要Feed模块能够提供的灵活性,因为导入的数据将针对不同的内容类型导入,我将把图像和其他附件拉到新创建的Drupal页面中。考虑到这一点,标准的WordPress迁移将无法解决这一问题 因此,WXR格式在提要中将Wordpress帖子和附件作为单独的项目,并使用id链接帖子和附件。附件可以是图像、文件(pdf、doc等),可以在xpathwp:postETA/wp:
项目
,并使用id链接帖子和附件。附件可以是图像、文件(pdf、doc等),可以在xpathwp:postETA/wp:meta\u key
中找到,值为_thumbnail\u id,_wp\u attached\u file
我想做的是从attachment类型的项中获取各种节点,并将它们放在coost项中,id将它们链接在一起
要转换的xml片段。。。第一项是post
第二项是附件
。
<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>
一些很棒的标题
http://example.com/groovy-example
2050
页
...
...
...
_缩略图id
566
...
...
...
我奇妙的依恋
http://www.example.com/fantastic-attachment
566
附件
...
...
...
http://www.example.com/wp-content/uploads/2012/12/fantastic.jpg
_wp_随附文件
2012/12/fantastic.jpg
在转换之后,我想要
<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>
一些很棒的标题
http://example.com/groovy-example
2050
页
...
...
...
_缩略图id
566
http://www.example.com/wp-content/uploads/2012/12/fantastic.jpg
也许有更好的方法?可能合并帖子和附件,id在节点之间创建链接
我是XSLT新手,读过一些关于身份转换的帖子,我认为这是正确的方向,但我只是没有经验来解决我需要的问题,希望能得到帮助。看起来我已经找到了解决方案 我使用了许多索引来组织附件。在进一步检查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>
一些很棒的标题
http://example.com/groovy-example
2050
页
...
...
...
斯潘
http://www.example.com/wp-content/uploads/2012/03/spanner.jpg
修复小部件:白痴指南
http://www.example.com/wp-content/uploads/2012/12/fixiing-widgets.pdf
自己钻吧
http://www.example.com/wp-content/uploads/2013/04/trepanning.pdf
因此,使用下面的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>