2009-07-14 46 views
0

我想使用wikipedia API来查找法文页面,包括英文版中缺少的''Template:Infobox Scientifique''。所以,我的想法是处理与XPROC以下文件:使用xslt,xpath:document()和mediawiki的Recusive转换

http://fr.wikipedia.org/w/api.php?action=query&format=xml&list=embeddedin&eititle=Template:Infobox%20Scientifique&eilimit=400

和下面的XSLT样式表:

<?xml version='1.0' ?> 
<xsl:stylesheet 
    xmlns:xsl='http://www.w3.org/1999/XSL/Transform' 
    version='1.0' 
    > 
<xsl:output method='text' indent="yes"/> 
<xsl:template match="/"> 
<xsl:apply-templates select="api"/> 
</xsl:template> 

<xsl:template match="api"> 
<xsl:for-each select="query/embeddedin/ei"> 
<xsl:variable name="title" select="translate(@title,&apos; &apos;,&apos;_&apos;)"/> 
<xsl:variable name="english-title"> 
<xsl:call-template name="englishTitle"><xsl:with-param name="title" select="@title"/></xsl:call-template> 
</xsl:variable> 

<xsl:value-of select="$english-title"/><xsl:text> 
</xsl:text> 

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

<xsl:template name="englishTitle"> 
<xsl:param name="title"/> 
<xsl:variable name="uri1" select="concat(&apos;http://fr.wikipedia.org/w/api.php?action=query&amp;format=xml&amp;prop=langlinks&amp;lllimit=500&amp;titles=&apos;,translate($title,&apos; &apos;,&apos;_&apos;))"/> 
<xsl:message><xsl:value-of select="$uri1"/></xsl:message> 
<xsl:message>count=<xsl:value-of select="count(document($uri1,/api/query/pages/page/langlinks/ll))"/></xsl:message> 
</xsl:template> 

</xsl:stylesheet> 

的XSLT提取出所有包含该模板的文章,每篇文章我想调用维基百科获得维基之间的链接。这里,模板englishTitle调用xpath函数document()

但它总是说count(ll)=1而有很多节点。 (例如http://fr.wikipedia.org/w/api.php?action=query&format=xml&prop=langlinks&lllimit=500&titles=Carl_Sagan)。

我不能处理由文件()函数返回的节点?

回答

1

你应该尝试:

<xsl:value-of select="count(document($uri1)/api/query/pages/page/langlinks/ll)"/> 

在不同的音符 -

translate(@title,&apos; &apos;,&apos;_&apos;) 

应该指的是什么?有什么不对:

translate(@title, ' ', '_') 

没有必要在XML编码单引号的属性,除非你想用一个类型的报价,其限制的属性值。所有这些都是有效的:

name="foo&quot;'foo" 
name='foo&apos;"foo' 

你的整个改造可以降低到这样的事情:

<xsl:stylesheet 
    version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
> 
    <xsl:output method="text" /> 

    <xsl:param name="baseUrl" select="'http://fr.wikipedia.org/w/api.php?action=query&amp;format=xml&amp;prop=langlinks&amp;lllimit=500&amp;titles='" /> 

    <xsl:template match="ei"> 
    <xsl:variable name="uri" select="concat($baseUrl ,translate(@title,' ','_'))"/> 
    <xsl:variable name="doc" select="document($uri)"/> 

    <xsl:value-of select="$uri"/> 
    <xsl:text>&#10;</xsl:text> 

    <xsl:text>count=</xsl:text> 
    <xsl:value-of select="count($doc/api/query/pages/page/langlinks/ll)"/> 
    <xsl:text>&#10;</xsl:text> 
    </xsl:template> 

    <xsl:template match="text()" /> 
</xsl:stylesheet> 

让XSLT默认模板为你工作 - 他们做了一切递归的背景下,所有你需要做的就是抓住你要处理(和防止不必要的文本的输出通过覆盖有一个空的默认text()模板)的节点。

+0

谢谢,它的工作:-) – Pierre 2009-07-14 18:55:32