@drumminman
Tehwriter, mountain biker, trailbuilder

Варианты поиска текстовой ноды с вложенными inline-тегами?

Всем доброго времени суток.
В общем, ситуация такая. Имеются исходники документации в DocBook XML 4.5, которые я сейчас переформатирую в DocBook 5.
И в старых исходниках периодически встречаются места, в которых текстовые ноды лежат в качестве прямых потомков узлов, которые в DocBook 5 уже не предполагают возможности такого расположения. Более того, при этом эта текстовая нода может еще содержать один или несколько inline-тегов.
К примеру:
<entry>
   <para>какой то параграф</para>
  <itemizedlist/>
   просто текст с каким то <sgmltag>инлайн-тегом</sgmltag>
</entry>

Соответственно, при переводе из старого формата в новый (есть там один скриптик), оксиген начинает сильно ругаться на подобные вещи.
Я пытаюсь отловить подобные ноды, но что то как то пока безуспешно
Текущий шаблон следующий (он еще заодно все потомки , которые не в параграфах, перемещает в para):
<xsl:template match="*[parent::entry]">        
        <xsl:choose>
           <xsl:when test="self::para">
               <xsl:copy>                
                   <xsl:copy-of select="@*"/>
                   <xsl:apply-templates/>                
               </xsl:copy>
           </xsl:when>
           <xsl:otherwise>
                       <para>
                           <xsl:copy>                
                               <xsl:copy-of select="@*"/>
                               <xsl:apply-templates/>                
                           </xsl:copy> 
                       </para>
           </xsl:otherwise>
       </xsl:choose> 
    </xsl:template>  

    <xsl:template match="text()[parent::entry]">
        <xsl:variable name="varTest">
            <xsl:value-of select="normalize-space(.)"/>
        </xsl:variable>
        <xsl:if test="$varTest != ''">
            <para>
                <xsl:copy-of select="normalize-space(.)"/>            
            </para>
        </xsl:if>        
    </xsl:template>

По итогу применения, эти два шаблона на выходе дадут XML вида:
<entry>
   <para>какой то параграф</para>
   <para><itemizedlist/></para>
   <para>просто текст с каким то </para><para><sgmltag>инлайн-тегом</sgmltag></para>
</entry>


Конечный вывод не радует, надо как то перенести всю строку вместе с sgmltag внутрь одного para, а как получить именно всю текстовую ноду + инлайн тег внутри нее, не понятно.

Руками просто это все править я умахаюсь, исходников сотни файлов, хотелось бы как то автоматизировать..
  • Вопрос задан
  • 54 просмотра
Пригласить эксперта
Ответы на вопрос 1
dimonchik2013
@dimonchik2013
non progredi est regredi
Ваша проблема - в невладении инструментом: как знающему Питон поверхностно (ну или не поверхностно), мне искренне непонятно, как с структурированным текстовым форматом можно не мочь что-то сделать?

Вы упоминаете Оксиген, видимо, это он
https://www.oxygenxml.com/xml_editor/xpath.html

ну, пробуйте им - Xpath в помощь
https://stackoverflow.com/questions/27017302/xpath...

для всего остального - Python + lxml
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы