WedX - журнал о программировании и компьютерных науках

как извлечь дочерний элемент из вложенных тегов с помощью xslt

I have a scenario in xml :

    <body>
        <div><i>italic</i>
            <div id ="88">
                <div id="4545">
                    <h3>hey h3</h3>
                    <xyz>XYZ</xyz>
                </div>
            </div>
        </div>
        <div  id="123">
            <h1>Example</h1>
                <div  id="1234">
                    <h1>heading 1</h1>
                    <p>computer</p>
                    <div>
                        <i>italic 2</i>
                        <div>
                            <h3>heading 3</h3>
                        </div>
                    </div>    
                </div>
            <div  id="12345">
                <h1>heading 1</h1>
            </div>
        </div>
    </body>

I need to apply the rule that div converted to section and the div in which h1 value is Example ,delete that h1 tag and add attribute class=<value of that h1> to section tag .

expected output:
    <body>
        <section>
            <i>italic<i>
        </section>
        <section class="hey h3">

             <xyz>XYZ</xyz>
        </section>
        <section class="example">
            <title>heading 1</title>
            <p>computer</p>
        </section>
        <section>
            <i>italic 2</i>
        </section>
        <section>
        <h3>heading 3</h3>
        </section>
        <section >
            <title>heading 1</title>
        </section>
    </body>

my xslt:
<xsl:template match="node()|@*">
        <xsl:copy>
            <xsl:apply-templates select="node()|@*"/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="div[h1='Example']">
        <xsl:apply-templates select="node()[not(self::h1)]"/>
    </xsl:template>

    <xsl:template match="div/h1">
        <title>
            <xsl:apply-templates/>
        </title>
    </xsl:template>

    <xsl:template match="div[h3='hey h3']">
        <xsl:apply-templates select="node()[not(self::h3)]"/>
    </xsl:template>

    <xsl:template match="div/h3">
        <title>
            <xsl:apply-templates/>
        </title>
    </xsl:template>

    <xsl:template match="div[not(h1='Example')]">
        <section>
            <xsl:if test="preceding-sibling::*[1][self::h1[.='Example']]">
                <xsl:attribute name="class">example</xsl:attribute>
            </xsl:if>
            <xsl:apply-templates select="node()[not(self::div)]"/>
        </section>
        <xsl:apply-templates select="node()[self::div]"/>
    </xsl:template>

    <xsl:template match="div[not(h3='hey h3')]">
        <section>
            <xsl:if test="preceding-sibling::*[1][self::h3[.='hey h3']]">
                <xsl:attribute name="class">richi rich</xsl:attribute>
            </xsl:if>
            <xsl:apply-templates select="node()[not(self::div)]"/>
        </section>
        <xsl:apply-templates select="node()[self::div]"/>
    </xsl:template>



actual output:
    <body>
        <section>
            <i>italic</i>
        </section>
        <section/>
        <section>
            <title>hey h3</title>
            <xyz>XYZ</xyz>
        </section>
        <section>
            <title>Example</title>
        </section>
        <section>
            <title>heading 1</title>
            <p>computer</p>
        </section>
        <section>
            <i>italic 2</i>
        </section>
        <section>
            <title>heading 3</title>
        </section>
        <section>
            <title>heading 1</title>
        </section>
    </body>

На самом деле есть два сценария: 1. вложенный раздел не должен присутствовать и 2. условие, которое имеет «заголовок 1», затем удалите этот тег из div и добавьте атрибут в div со значением tag .

Не могли бы вы предложить, что я должен сделать здесь, чтобы получить ожидаемый результат.

01.03.2019

Ответы:


1

начните с шаблона идентификации:

<xsl:template match="node()|@*">
    <xsl:copy>
        <xsl:apply-templates select="node()|@*"/>
    </xsl:copy>
</xsl:template>

затем сопоставьте узел div, который содержит целевой узел h1

<xsl:template match="div[h1='Example']">
    <!-- apply child nodes except h1 -->
    <xsl:apply-templates select="node()[not(self::h1)]"/>
</xsl:template>

и шаблон для div узлов, которые не содержат целевой h1 узел

<xsl:template match="div[not(h1='Example')]">
    <section>
        <!-- set the attribute if the immediate preceding-sibling node is h1 -->
        <xsl:if test="preceding-sibling::*[1][self::h1[.='Example']]">
            <xsl:attribute name="class">example</xsl:attribute>
        </xsl:if>
        <xsl:apply-templates select="node()[not(self::div)]"/>
    </section>
    <xsl:apply-templates select="node()[self::div]"/>
</xsl:template>

и шаблон для узла h1

<xsl:template match="div/h1">
    <title>
        <xsl:apply-templates/>
    </title>
</xsl:template>

Вся таблица стилей выглядит следующим образом:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="https://www.w3.org/1999/XSL/Transform"
    xmlns:xs="https://www.w3.org/2001/XMLSchema"
    exclude-result-prefixes="xs"
    version="2.0">

    <xsl:template match="node()|@*">
        <xsl:copy>
            <xsl:apply-templates select="node()|@*"/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="div[h1='Example']">
        <xsl:apply-templates select="node()[not(self::h1)]"/>
    </xsl:template>

    <xsl:template match="div/h1">
        <title>
            <xsl:apply-templates/>
        </title>
    </xsl:template>

    <xsl:template match="div[not(h1='Example')]">
        <section>
            <xsl:if test="preceding-sibling::*[1][self::h1[.='Example']]">
                <xsl:attribute name="class">example</xsl:attribute>
            </xsl:if>
            <xsl:apply-templates select="node()[not(self::div)]"/>
        </section>
        <xsl:apply-templates select="node()[self::div]"/>
    </xsl:template>

</xsl:stylesheet>

увидеть его в действии (https://xsltfiddle.liberty-development.net/pPzifpb/3)

01.03.2019
  • если у меня есть другие разделы, кроме упомянутого... этот код применяет новый раздел, а затем снова для других разделов он будет вложенным. 01.03.2019
  • потому что есть некоторые другие div, которые не содержат h1, и они оборачивают другие div внутри раздела. 01.03.2019
  • По сути, код правильный. Я добавил несколько строк кода, чтобы украсить вывод. xsltfiddle.liberty-development.net/pPzifpb/2 01.03.2019
  • да.. нормально работает. Но если это 3 или 4 уровня глубины, то это не работает. 01.03.2019
  • вложенный div с курсивным дочерним элементом отсутствует в требуемом выводе 01.03.2019
  • Я обновил свой код. Если есть два условия, на основании которых мне нужно добавить атрибут в тег ‹div›. 1. если значение ‹h3› равно h3, то удалите этот тег и добавьте атрибут в раздел со значением h3. 2. что я объяснил ранее. Теперь в этом случае я не могу получить ожидаемый результат. Не могли бы вы предложить. 04.03.2019
  • Новые материалы

    Объяснение документов 02: BERT
    BERT представил двухступенчатую структуру обучения: предварительное обучение и тонкая настройка. Во время предварительного обучения модель обучается на неразмеченных данных с помощью..

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

    Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
    Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

    Учебные заметки: создание моего первого пакета Node.js
    Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

    Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
    Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..


    Для любых предложений по сайту: [email protected]