xsl <choose>: Как выбрать следующего брата с определенным ребенком? - PullRequest
0 голосов
/ 20 марта 2019

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

<entry>
      <form>
        <orth></orth>
        <orth></orth>       
      </form>
      <form>
        <note></note>
        <orth></orth>
      </form>
</entry>

С помощью xsl <choose> Я хочу выбрать <form> только в том случае, если следующее <form> имеет <note> в качестве дочернего элемента.Я пытался

<xsl:template match="tei:form">
  <xsl:choose>

    <xsl:when test="following-sibling::*[1][name()='form' and child='note']">
      <xsl:apply-templates/><text>\ </text>
    </xsl:when>

  </xsl:choose>
</xsl:template>

Но это не работает.Как мне правильно обратиться к <form> с <note> как ребенок?

Ответы [ 2 ]

0 голосов
/ 20 марта 2019

Если вы собираетесь применять шаблоны ко всем вашим form элементам, тогда вы можете избежать использования условных инструкций и просто использовать шаблоны, такие как:

<xsl:template match="form">
    <!-- General case -->
</xsl:template>

<xsl:template match="form[following-sibling::form[1]/note]">
    <!-- Particular case -->
</xsl:template>

Обратите внимание : эти шаблоны имеют различный приоритет по умолчанию , поэтому шаблон для применения полностью определен.

0 голосов
/ 20 марта 2019

Ваш вопрос сбивает с толку. xsl:choose ничего не выбирает.

Если вы хотите использовать xsl:choose в контексте form - IOW, вы хотите обработать все form элементов и выбрать, какой код должен выполняться на основе существования note в ближайшем родственнике - попробуйте что-то вроде:

<xsl:template match="form">
    <xsl:choose>
        <xsl:when test="following-sibling::form[1]/note">
            <!-- DO SOMETHING -->
        </xsl:when>
        <xsl:otherwise>
            <!-- DO SOMETHING ELSE -->
        </xsl:otherwise>
    </xsl:choose>
</xsl:template>

Чтобы обработать только элементы формы, которые удовлетворяют условию, попробуйте вместо этого:

<xsl:template match="entry">
    <!-- ... -->
    <xsl:for-each select="form[following-sibling::form[1]/note]">
        <!-- DO SOMETHING -->
    </xsl:for-each>
    <!-- ... -->
</xsl:template>
...