XSL 1.0 отдельная группировка - PullRequest
0 голосов
/ 28 ноября 2018

У меня есть следующий XML.

<word>
    <lemma POS="глагол" Aspect="несвършен"  Transitive= "непреходен">викам</lemma>
    <morph>
      <FiniteForm Tense="present" Person="1" Number="ед.ч.">викам</FiniteForm>
      <FiniteForm Tense="present" Person="2" Number="ед.ч.">викаш</FiniteForm>
      <FiniteForm Tense="present" Person="3" Number="ед.ч.">вика</FiniteForm>
      <FiniteForm Tense="past_simple" Person="2" Number="ед.ч.">вика</FiniteForm>
      <FiniteForm Tense="past_simple" Person="3" Number="ед.ч.">вика</FiniteForm>
      <FiniteForm Tense="past_continues" Person="1" Number="ед.ч.">виках</FiniteForm>
      <FiniteForm Tense="past_continues" Person="2" Number="ед.ч.">викаше</FiniteForm>
      <FiniteForm Tense="past_continues" Person="3" Number="ед.ч.">викаше</FiniteForm>
   </morph>
</word>
<word>
    <lemma POS="глагол" Aspect="несвършен"  Transitive= "непреходен">вървя</lemma>
    <morph>
      <FiniteForm Tense="present" Person="1" Number="ед.ч.">вървя</FiniteForm>
      <FiniteForm Tense="present" Person="2" Number="ед.ч.">вървиш</FiniteForm>
      <FiniteForm Tense="present" Person="3" Number="ед.ч.">вървят</FiniteForm>
      <FiniteForm Tense="past_simple" Person="2" Number="ед.ч.">вървят</FiniteForm>
      <FiniteForm Tense="past_simple" Person="3" Number="ед.ч.">вървя</FiniteForm>
      <FiniteForm Tense="past_continues" Person="1" Number="ед.ч.">вървях</FiniteForm>
      <FiniteForm Tense="past_continues" Person="2" Number="ед.ч.">вървеше</FiniteForm>
      <FiniteForm Tense="past_continues" Person="3" Number="ед.ч.">вървеше</FiniteForm>
   </morph>
</word>

Извините за кириллические символы.Я хочу сгруппировать это по FiniteForm @Tense для каждого слова.То, что я сейчас делаю, - это циклическое прохождение каждого слова.И выполняет мюнхенскую группировку.Проблема в том, что мой ключ фактически соответствует каждой FiniteForm, и я хочу, чтобы он совпадал только с теми тегами FiniteForm внутри тега слова, в котором я нахожусь.

Вот как я сейчас создаю ключ.

<xsl:key name="finiteFormsByTense" match="FiniteForm" use="@Tense" />

И это то, что я делаю.

<xsl:for-each select="word">
<xsl:for-each select="morph/FiniteForm[generate-id() = generate-id(key('finiteFormsByTense', @Tense)[1])]">
    <xsl:variable name="current-grouping-key" select="@Tense"/>
    <xsl:variable name="current-group" select="key('finiteFormsByTense', $current-grouping-key)"/>
    <xsl:variable select="count($current-group)+1" name="groupSize"/>
    <tr>
        <td rowspan="{$groupSize}">
            <xsl:value-of select="$current-grouping-
        </td>
    </tr>
    <xsl:for-each select="$current-group">
        <tr>
            <td><xsl:value-of select="@Person"/></td>
            <td><xsl:value-of select="@Number"/></td>
            <td><xsl:value-of select="."/></td>
        </tr>
</xsl:for-each>
</xsl:for-each>

1 Ответ

0 голосов
/ 28 ноября 2018

Определите ваш ключ как:

<xsl:key name="finiteFormsByTense" match="FiniteForm" use="concat(generate-id(..), '|', @Tense)" />

Затем используйте его как:

<xsl:for-each select="morph/FiniteForm[generate-id() = generate-id(key('finiteFormsByTense', concat(generate-id(..), '|', @Tense))[1])]">

Это добавляет идентификатор родительского morph к ключу, так чтоформы каждого морфа сгруппированы отдельно.

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