Проверить, что последнее вложенное деление является конкретным элементом - PullRequest
0 голосов
/ 29 апреля 2019

Я хочу, чтобы правило, обеспечивающее, чтобы любой div[@class='extend']/div[@class='check'] был последним в пределах div[@class='chapter']. Обратите внимание, что могут быть другие «расширенные» подразделения, которые имеют разные вложенные элементы (например, div[@class='extend']/div[@class='video']), местоположение которых, как ожидается, не будет последним. Вложенный бит div[@class='extend']/div[@class='check'] заставляет меня написать это правило.

Я пробовал:

XML

<test>
<div class="chapter" id="s1">
    <h1 class="title">18.3</h1>
    <div class="intro" id="s2">
        <p>Some intro text here</p>
    </div>
    <!--Incorrect position of div class="extend"/div class="check"-->
    <div class="extend" id="s3">
        <div class="check" id="s4">
            <div class="metadata" id="s5">
                <div class="title" id="s6">
                    <p>Check 18.3</p>
                </div>
            </div>
            <h1 class="title">Check 18.3</h1>
            <p>This is the Check for Chapter 18.3</p>
        </div>
    </div>
    <!---\-\-\-->
    <div class="sect1" id="s7">
        <h1 class="title">Section text here</h1>
        <p>text text text.</p>
        <div class="extend" id="s8">
            <div class="video">
                <div class="metadata" id="s9">
                    <div class="title" id="s10">
                        <p>Video 18.3</p>
                    </div>
                </div>
                <h1 class="title">Video 18.3</h1>
                <p>This is the Video for Chapter 18.3</p>
            </div>
        </div>
        <div class="sect2" id="s11">
            <h1 class="title">Section text here</h1>
            <p>text text text.</p>
        </div>
    </div>
    <!--div class="extend"/div class="check" should be here as last div of chapter-->
</div>
</test>

Schematron:

<pattern id="lastdiv">
        <rule context="xhtml:div[@class='check']">
            <assert test="(ancestor::xhtml:div[@class='chapter']/xhtml:div[@class='extend'])[last()]" role="error">This check (with <value-of select="@id"/>) should be the last extend div within a chapter.</assert>
        </rule>
</pattern>

Однако, это не находит мой ожидаемый результат (должен выдать ошибку).

Ответы [ 2 ]

1 голос
/ 30 апреля 2019

Хорошо, согласно вашему комментарию как ответу Джошуа, я полагаю, что расширение / проверка должно быть действительно последним содержанием главы (а не только последним).

Это должно работать:

    <pattern id="lastdiv">
        <rule context="xhtml:div[@class = 'extend'][xhtml:div[@class = 'check']]">
            <!-- the current extend div -->
            <let name="extend" value="."/>
            <!-- all elements of the current chapter, except of $extend and its descendantes -->
            <let name="chapterElements" value="ancestor::xhtml:div[@class = 'chapter']//* except ($extend, $extend//*)"/>
            <!-- all $chapterElements which have a larger document position (>>) than the $extend-->
            <let name="followingChapterElements" value="$chapterElements[. >> $extend]"/>
            <!-- If there is a $followingChapterElements, the check fails-->
            <report test="$followingChapterElements" role="error">This check (with <value-of select="@id"/>) should be the last extend div within a chapter.</report>
        </rule>
    </pattern>

Надеюсь, комментарии помогут понять.

0 голосов
/ 29 апреля 2019

Как насчет следующего?

<pattern id="lastdiv">
    <!-- This rule fires on divs that have a class of "extend" and that have a child div with a class of "check" -->
    <rule context="xhtml:div[@class='extend' and xhtml:div/@class='check']">
    <!-- The assert tests that the div is the last div within its parent -->
        <assert test="position() = last()" role="error">This check (with <value-of select="@id"/>) should be the last extend div within a chapter.</assert>
    </rule>
</pattern>

Обратите внимание, что это решение утверждает, что div с class="extend" является последним дочерним элементом (любого рода) в chapter.Если chapter может иметь другие элементы после этого div (включая другие div элементы без class="extend"), это утверждение не будет работать правильно.

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