Преобразование файла .tei в файл .txt - PullRequest
0 голосов
/ 06 октября 2018

У меня есть .tei файл следующего формата.

<biblStruct xml:id="b0">
    <analytic>
        <title level="a" type="main">The Semantic Web</title>
        <author>
            <persName xmlns="http://www.tei-c.org/ns/1.0">
                <forename type="first">T</forename>
                <surname>Berners-Lee</surname>
            </persName>
        </author>
        <author>
            <persName xmlns="http://www.tei-c.org/ns/1.0">
                <forename type="first">J</forename>
                <surname>Hendler</surname>
            </persName>
        </author>
        <author>
            <persName xmlns="http://www.tei-c.org/ns/1.0">
                <forename type="first">O</forename>
                <surname>Lassilia</surname>
            </persName>
        </author>
    </analytic>
    <monogr>
        <title level="j">Scientific American</title>
        <imprint>
            <date type="published" when="2001-05" />
        </imprint>
    </monogr>
</biblStruct>

Я хочу преобразовать указанный выше файл в формат .txt, который выглядит следующим образом:

T.Бернерс-Ли, Дж. Хендлер и О. Лассилия.«Семантическая сеть», Scientific American, май 2001 г.

Я попытался использовать следующий фрагмент кода:

tree = ET.parse(path)
root = tree.getroot()
s = ""
for childs in root:
    for child in childs:
        s= s+child.text

Проблема с приведенным выше кодом заключается в том, что цикл выполняется последовательнои строка не в последовательном формате.

Во-вторых, может быть еще больше внутренних циклов.Извлечение чего-либо из внутренних циклов без проверки вручную также проблематично.Пожалуйста, помогите мне с этим

1 Ответ

0 голосов
/ 06 октября 2018

Я знаю, что вы ищете решение Python, но поскольку XSLT является такой удобной альтернативой и идеально подходит для файла .xml, я все равно публикую решение XSLT.

Я думаю, этоможет быть легко интегрирован в ваше решение Python.
Так что это необходимый XSLT:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:tei="http://www.tei-c.org/ns/1.0" xmlns:month="http://month.com">
    <xsl:output method="text" />
    <xsl:strip-space elements="*" />

    <month:month>
        <month name="Jan" />
        <month name="Feb" />
        <month name="Mar" />
        <month name="Apr" />
        <month name="May" />
        <month name="Jun" />
        <month name="Jul" />
        <month name="Aug" />
        <month name="Sep" />
        <month name="Oct" />
        <month name="Nov" />
        <month name="Dec" />
    </month:month>

    <xsl:template match="author[position()=1]">
        <xsl:value-of select="concat(tei:persName/tei:forename, '. ',tei:persName/tei:surname)" />
    </xsl:template>    

    <xsl:template match="author">
        <xsl:value-of select="concat(', ',tei:persName/tei:forename, '. ',tei:persName/tei:surname)" />
    </xsl:template>

    <xsl:template match="author[last()]">
        <xsl:value-of select="concat(' and ',tei:persName/tei:forename, '. ',tei:persName/tei:surname)" />
    </xsl:template>

    <xsl:template match="/biblStruct">
        <xsl:apply-templates select="analytic/author" />
        <xsl:variable name="mon" select="number(substring(monogr/imprint/date/@when,6,2))" />
        <xsl:value-of select='concat(" &apos;",analytic/title,"&apos;",", ",monogr/title, ", ")' />   
        <xsl:value-of select="document('')/xsl:stylesheet/month:month/month[$mon]/@name" />
        <xsl:value-of select="concat(' ',/xsl:stylesheet/month:month[substring(monogr/imprint/date/@when,5,2)],substring(monogr/imprint/date/@when,1,4))" />
    </xsl:template>

</xsl:stylesheet>

Вам не нужно много знать о XSLT, чтобы понять этот код:
Существует три шаблонасоответствующие author элементы - один соответствует первому совпадению, один соответствует last() совпадению и один соответствует всем между ними.Они отличаются только обработкой разделителей, таких как , и and.

Последний шаблон обрабатывает весь XML и объединяет выходные данные трех других шаблонов.Он также преобразует числовой номер месяца в строку, ссылаясь на остров данных month:month.

Вам также следует взглянуть на определенные пространства имен элемента xsl:stylesheet:

Я надеюсь, чтоЯ убедительно обосновал использование файла XSLT для преобразования.Элемент xsl:output указывает желаемую цель вывода текста с помощью method="text".

...