2009-07-14 4 views
0

Ich möchte die wikipedia API verwenden, um die Französisch Seiten einschließlich der Vorlage zu finden: Infobox Scientifique fehlt in der englischen Version. So, das war meine Idee, das folgende Dokument mit Xproc zu verarbeiten:Aufschließende Transformationen mit xslt, xpath: document() und mediawiki

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

und das folgende Stylesheet:

<?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> 

Der XSLT extrahieren Sie alle Artikel, die die Vorlage enthalten und für jeden Artikel, den ich wollte wikipedia anrufen, um die Links zwischen den Wikis zu erhalten. Hier ruft die Vorlage englishTitle die Xpath-Funktion document() auf.

Aber es sagt immer, dass count(ll)=1 während es viele Knoten gibt. (z.B. http://fr.wikipedia.org/w/api.php?action=query&format=xml&prop=langlinks&lllimit=500&titles=Carl_Sagan).

Kann ich die von der document()-Funktion zurückgegebenen Knoten nicht verarbeiten?

Antwort

1

sollten Sie versuchen:

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

Auf einem anderen Ton - was ist

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

bedeuten soll? Was ist los mit:

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

Es besteht keine Notwendigkeit Apostrophe in XML zu kodieren Attribute, wenn Sie eine Art von Angebot verwenden möchten, die den Attributwert begrenzt. All dies sind gültig:

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

Ihre gesamte Transformation zu so etwas wie dies reduziert werden kann:

für Sie
<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> 

Lassen Sie die XSLT-Standardvorlagen arbeiten - sie alle der Rekursion im Hintergrund zu tun, Sie müssen nur die Knoten auffassen, die Sie verarbeiten möchten (und verhindern, dass unnötiger Text ausgegeben wird, indem Sie die Standardvorlage text() mit einer leeren überschreiben).

+0

Danke, es hat funktioniert :-) – Pierre

Verwandte Themen