scieloorg / Web

SciELO Web
www.scielo.br
6 stars 21 forks source link

Erro na interface OAI-PMH: XML Parsing Error: mismatched tag. Expected: </dc:identifier>. #688

Closed gustavofonseca closed 5 years ago

gustavofonseca commented 5 years ago

O erro se manifesta apenas no prefixo oai_dc_agris. Note que com o prefixo oai_dc os dados são retornados corretamente.

Screen Shot 2019-07-25 at 10 09 47

http://www.scielo.br/oai/scielo-oai.php?verb=ListRecords&metadataPrefix=oai_dc_agris&from=2017-07-11&set=0102-311X

robertatakenaka commented 5 years ago

@gustavofonseca @joffilyfe

O XML agris.xml.zip

é gerado a partir da Transformação de
http://www.scielo.br/cgi-bin/wxis.exe/?script=sci_listrecords_agris&database=artigo&IsisScript=ScieloXML/sci_listrecords_agris.xis&PATH_TRANSLATED=../htdocs/&metadataPrefix=oai_dc_agris&from=2017-07-11&set=0102-311X

com htdocs/oai/ListRecords_agris.xsl que inclui htdocs/oai/oai_agris_common.xsl

O problema ocorre no ponto:

  <dc:identifier scheme="dcterms:URI">
      <![CDATA[http://www.scielo.br/scielo.php?script=sci_arttext&amp;pid=S0102-311X1985000100014&amp;lng=en&amp;nrm=iso&amp;tlng=en]]&gt;</dc:identifier>

Gera ]]&gt; no lugar de ]]>

O defeito está em oai_agris_common.xsl

<xsl:template match="article-meta" mode="identifier">
        <!--dc:identifier scheme="dcterms:URI"><xsl:text disable-output-escaping="yes">&lt;![CDATA[http://www.scielo.br/scielo.php?script=sci_arttext&amp;pid=</xsl:text><xsl:value-of select="article-id"/><xsl:text disable-output-escaping="yes">]]&gt;</xsl:text></dc:identifier-->
<dc:identifier scheme="dcterms:URI">&lt;![CDATA[<xsl:value-of select=".//self-uri[1]/@xlink:href"/>]]&gt;</dc:identifier>
    <dc:identifier scheme="ags:DOI"><xsl:value-of select=".//article-id[@pub-id-type='doi']"/></dc:identifier>
</xsl:template>

O jeito recomendado para incluir CDATA é:


    <xsl:text disable-output-escaping="yes">&lt;![CDATA[</xsl:text>

    <xsl:text disable-output-escaping="yes">]]&gt;</xsl:text>

Outros lugares onde ocorre CDATA dentro do oai:

oai_agris_common.xsl:

<dc:title xml:lang="{article-title/@xml:lang}"><xsl:text disable-output-escaping="yes">&lt;![CDATA[</xsl:text><xsl:value-of select="article-title"/><xsl:text disable-output-escaping="yes">]]&gt;</xsl:text></dc:title>

<dcterms:abstract xml:lang="{@xml:lang}"><xsl:text disable-output-escaping="yes">&lt;![CDATA[</xsl:text><xsl:value-of select="p" disable-output-escaping="yes"/><xsl:text disable-output-escaping="yes">]]&gt;</xsl:text></dcterms:abstract>

<!--dc:identifier scheme="dcterms:URI"><xsl:text disable-output-escaping="yes">&lt;![CDATA[http://www.scielo.br/scielo.php?script=sci_arttext&amp;pid=</xsl:text><xsl:value-of select="article-id"/><xsl:text disable-output-escaping="yes">]]&gt;</xsl:text></dc:identifier-->

<dc:identifier scheme="dcterms:URI">&lt;![CDATA[<xsl:value-of select=".//self-uri[1]/@xlink:href"/>]]&gt;</dc:identifier>

oai_common.xsl:

<xsl:value-of select=" concat( '&lt;![CDATA[', . ,  ']]&gt;' ) " disable-output-escaping="yes"/>

<xsl:with-param name="value" select="concat( '&lt;![CDATA[', SURNAME , ',' , NAME ,  ']]&gt;' )"></xsl:with-param>

<xsl:with-param name="value"><xsl:value-of select="concat('&lt;![CDATA[',TITLE/text(),' ',$source,']]&gt;')"/> </xsl:with-param>

oai_openaire_common.xsl:

<xsl:value-of select=" concat( '&lt;![CDATA[', . ,  ']]&gt;' ) " disable-output-escaping="yes"/>

<xsl:with-param name="value" select="concat( '&lt;![CDATA[', SURNAME , ',' , NAME ,  ']]&gt;' )"></xsl:with-param>

<xsl:with-param name="value"><xsl:value-of select="concat('&lt;![CDATA[',TITLE/text(),' ',$source,']]&gt;')"/> </xsl:with-param>
gustavofonseca commented 5 years ago

Excelente, @robertatakenaka. E você acha que é necessário esse tanto de CDATA?

joffilyfe commented 5 years ago

Eu não consegui reproduzir o problema com uma base de dados diferente da que temos em br mas fica claro que em outras partes do código nós tratamos o CDATA da forma apontada por você, inclusive em na linha 65 acima da linha problemática. Posso estar enganado mas no XML resultante do endereço que está com problema é possível ver que as vezes nós temos o caractere < e as vezes tempos &lt;, por exemplo:

<dc:identifier scheme="dcterms:URI"><![CDATA[http://www.scielo.br/scielo.php?script=sci_arttext&amp;pid=S0102-05362017000200159&amp;lng=en&amp;nrm=iso&amp;tlng=en]]&gt;</dc:identifier>
<dc:identifier scheme="dcterms:URI">&lt;![CDATA[http://www.scielo.br/scielo.php?script=sci_arttext&amp;pid=S0102-05362017000200160&amp;lng=en&amp;nrm=iso&amp;tlng=en]]&gt;</dc:identifier>

Só a título de curiosidade você sabe o porque @robertatakenaka?

robertatakenaka commented 5 years ago

@gustavofonseca CDATA é necessário quando não quer processar o conteúdo... É um modo lazy para não tratar eventuais decodificações, imagino

@joffilyfe <![CDATA[ e ]]> para a saída do dado, já no XML

&lt;![CDATA[ e ]]&gt; na XSL, pois vc está informando que quer como saída: <![CDATA[ e ]]>.