xsl: пытается использовать «not» в операторе xsl: when / follow-sibling - PullRequest
0 голосов
/ 26 июня 2018

Я пытаюсь найти ситуации, когда за тегом заголовка (head1) не следует тег тела.

Вот фрагмент того, что я искал, "head1" и "body":

<title role="head1">Third-Party Notices and/or Licenses</title>
<para role="body">Required notices for open source software products or components used by Cloud are identified in the following table along with the applicable licensing information.</para>

А вот код, который я пытаюсь (пустой код head1 отлично работает):

<xsl:template match="w:p[w:pPr/w:pStyle/@w:val='ahead1']">
    <xsl:variable name="elementValue">
        <xsl:apply-templates mode="title.text.only" />
    </xsl:variable>
    <xsl:choose>
        <xsl:when test="$elementValue = ''">
            <xsl:message>ERROR: Encountered an head 1 paragraph with no text content.</xsl:message>
            <xsl:call-template name="revealDocPosition"/>
        </xsl:when>
        <!-- Code to check to see that a head1 is directly followed by a body tag -->
        <xsl:when test="[$elementValue]and not[following-sibling::*[1][self::atgbody]]"> 
        <!-- <xsl:when test="not[$elementValue][following-sibling::*[1][self::atgbody]]"> -->
            <xsl:message>ERROR: Encountered an atg head 1 paragraph that was not follwed by an atgbody.</xsl:message>
            <xsl:call-template name="revealDocPosition"/>
        </xsl:when>

Сбой в моей сборке, потому что ему не нравится синтаксис:

 [java] Error at xsl:when on line 30 column 84 of headings.xsl:
 [java]   XPST0003: XPath syntax error at char 0 on line 30 in {[$}:
 [java]     Unexpected token "[" in path expression
 [java] Failed to compile stylesheet. 1 error detected.

Я пробовал другой синтаксис, и он либо не работает, либо запускается и не находит ошибку. Идеи?

Ответы [ 2 ]

0 голосов
/ 27 июня 2018

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

Выражению [$elementValue] нечего проверять и фильтровать.

Предполагая, что вы пытаетесь проверить, является ли $elementValue "правдивым" и имеет контент, вам нужно переместить его за пределы предиката и просто проверить переменную.

Выражение not[following-sibling::*[1][self::atgbody]] проверяет, существует ли дочерний элемент с именем not, и применяет фильтр предикатов, который никогда не будет совпадать, поскольку у вас нет элементов not, поэтому этот тест никогда не будет верным. Вам нужно изменить [] на (), чтобы вызвать функцию not().

<xsl:when test="$elementValue and not(following-sibling::*[1][self::atgbody])"> 
0 голосов
/ 27 июня 2018
test="[$elementValue]and not[following-sibling::*[1][self::atgbody]]"

Вы, кажется, делаете это по ходу дела. Отгадывание синтаксиса никуда вас не приведет.

Я не знаю, что находится в переменной $elementValue, потому что вы не показали достаточно своего кода. Ваш код ссылается на элемент atgBody, которого нет в вашем фрагменте исходного документа, а шаблон соответствия также ссылается на узлы, которых нет в вашем исходном фрагменте. Это означает, что трудно понять, чего пытается достичь ваш код, и, следовательно, точно сказать вам, где это неправильно.

Синтаксическая ошибка в том, что [$elementValue] не является допустимым выражением. Не зная, что, по вашему мнению, это может значить, невозможно сказать вам, как это исправить.

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