Pergunta

Eu estou convertendo cerca de 4000 arquivos de texto que contêm HTML em entradas de banco de dados MySQL. Parece ser uma maneira fácil de fazer isso seria para adicionar algumas linhas ao HTML para torná-los aparecer como arquivos XML, em seguida, XSLT o XML em declarações MySQL INSERT. (Construindo um CSV também funcionaria, mas IMHO menos ideal). Eu tentei fazer isso, mas estou tendo pouca sorte recebendo minha XSL para jogar bonito.

Eu estou em uma caixa Windoze mas pode SSH em minha hospedagem e executar PHP, talvez Perl. Gostaria de automatizar isso, tanto quanto possível. Eu posso construir uma lista dos arquivos e alimentação que em um script com bastante facilidade.

Nome do ficheiro padrão: ab12345.html (parte numérica varia de 3-6 dígitos)

Exemplo de conteúdo do arquivo - esta é a totalidade do arquivo, não há rodapés / cabeçalhos HTML:

<div class="abEntry"><a name="top"><img width="1" height="1" src="images/common/blank.gif"/></a><div id="abEntryTitle"><div id="abEntryTitleText">What does error note "90210 Cannot Do This Thing" mean?</div></div>
            <div class="abEntryParagraph">This error means your McWhopper drive is frazzled. Read me the number off the modem--thats the little boxy thing attached to the big boxy thing--thanks.</div>
        <div class="abEntryDocumentNumber">ab90210</div>

colunas MySQL e como eu gostaria que eles para mapear de volta ao conteúdo anterior

EntryID = auto increment
title = contents of #abEntryTitleText
content = contents of #abEntryParagraph
lastupdated = curdate
related = "1"
visible = "1"
sortorder = "0"
userid = "1"
views = "0"
posvotes = "1"
negvotes = "0"
score = null
emailed = null
detectrelated = "1"
metakeywords = null
metadescription = contents of #abEntryDocumentNumber
startdate = curdate
enableexpiry = "0"
expirydate = null
featured = "0"
workflowstatus = "auto_approved"

XSL que eu tentei:

<xsl:transform version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform ">
<xsl:output method="html" indent="no"/>
<xsl:template match="/"><xsl:apply-templates/></xsl:template>
<xsl:template match="content">
<xsl:text>INSERT INTO questions (approved, title, description, publishDate) VALUES </xsl:text><xsl:text>(1, </xsl:text><xsl:value-of select="id(abEntryTitleText)"/><xsl:text>, </xsl:text>
<xsl:copy-of select="node()|@*"/>
<xsl:text>, </xsl:text>TODAY<xsl:text>,1, 1)</xsl:text>
</xsl:template>
</xsl:transform>
Foi útil?

Solução

O XSLT que você está procurando para criar uma instrução de inserção do elemento

seria

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:msxsl="urn:schemas-microsoft-com:xslt" 
    exclude-result-prefixes="msxsl">

    <xsl:output method="text" indent="no"/>

    <xsl:template match="div[@class='abEntry']">
INSERT INTO questions (approved, title, content, metadescription, publishDate)
VALUES (1, '<xsl:value-of select="normalize-space(*/div[@id='abEntryTitleText']/text())" />', '<xsl:value-of select="normalize-space(div[@class='abEntryParagraph']/text())" />', '<xsl:value-of select="normalize-space(div[@class='abEntryDocumentNumber']/text())" />', TODAY)
    </xsl:template>

</xsl:stylesheet>

Você pode modificar ainda mais para incluir os outros valores da coluna constante.

Depois que você precisa, obviamente, um script ou aplicativo para executar o xstl em cada arquivo. Eu poderia escrever algo rapidamente em .Net, se quiser, mas se você tem algumas outras ferramentas / capacidade de scripting útil que poderia ser mais rápido para usar isso.

Outras dicas

Eu não estou familiarizado com XSL, por isso gostaria de resolver este problema utilizando do php DOM . IIRC ele pôde analisar html sem ser xml adequada.

Tutortial em www.phpro.org

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top