Как объявить переменную, которая связывает атрибут с другим, в другом узле? - PullRequest
0 голосов
/ 02 мая 2019

Мне нужно объявить переменную.Я хотел бы связать / связать 2 атрибута в этой переменной.

<xsl:variable name="politiciens" select="Trans/Speakers/Speaker/@id='Trans/Episode/Section/Turn/@speaker'"/>`

    XSL =
    <xsl:for-each select="Trans/Speakers/Speaker[@check='yes']">
    <!-- declare a variable which contain @id, and whom will link/tie @speaker from Turn-->
    <xsl:variable name="politiciens" select="@id=//Turn/@Speaker" />
     <tr>
      <td><xsl:value-of select="@name"/></td>
       td><xsl:value-of select="count(Trans/Episode/Section/Turn[@Speaker=$politiciens]/tour/motBDL[@lexeme='JE'])" /></td>
    </tr>
    </xsl:for-each>

XML =

<Trans scribe="ComputerName" audio_filename="Debat Hollande Sarkozy 1998" video_filename="" version="8" version_date="181221">
     <Speakers>
        <Speaker id="spk1" name="Nicolas Sarkozy" check="yes"/>
    </Speakers>
    <Episode>
        <Section type="report" startTime="0" endTime="1408.652">
          <Turn startTime="0" endTime="0.152">
            <Sync time="0"/>
          </Turn>
          <Turn speaker="spk1" startTime="0.152" endTime="3.038">
            <Sync time="0.152"/>
            <tour nbmots="14" id="000000">
              <motBDL lexeme="POUR">pour</motBDL>
    </tour>
    </Turn>
    </Section>
    </Episode>
    </Trans>

Ожидаемый = Два атрибута, которые будут связаны вместе <xsl:variable name="politiciens" select="@id='@speaker'"/>

1 Ответ

1 голос
/ 02 мая 2019

Я думаю, это звучит так, как будто вам нужно прочитать ключи . Если вы хотите найти элементы Turn для текущего Speaker, вы можете определить ключ, например,

<xsl:key name="turns" match="Turn" use="@speaker" />

Затем в вашем xsl:for-each, который получает колонки, вы можете использовать клавишу для подсчета количества turn элементов, например:

<xsl:value-of select="count(key('turns', @id)/tour/motBDL)" />

(я пропустил проверку @lexeme='JE', потому что в вашем XML нет подходящего значения)

Попробуйте этот XSLT в качестве отправной точки:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
  <xsl:output method="html" indent="yes" />

  <xsl:key name="turns" match="Turn" use="@speaker" />

  <xsl:template match="/">
    <table>
      <xsl:for-each select="Trans/Speakers/Speaker[@check='yes']">
        <tr>
          <td><xsl:value-of select="@name"/></td>
          <td><xsl:value-of select="count(key('turns', @id)/tour/motBDL)" /></td>
        </tr>
      </xsl:for-each>
    </table>
  </xsl:template>
</xsl:stylesheet>

И, в качестве примера, вы также можете определить ключ для поиска самих элементов Speaker, если вы хотите перечислить отдельные повороты.

Например ....

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
  <xsl:output method="html" indent="yes" />

  <xsl:key name="speakers" match="Speaker" use="@id" />

  <xsl:template match="/">
    <table>
      <xsl:for-each select="Trans/Episode/Section/Turn[@speaker != '']">
        <tr>
          <td><xsl:value-of select="key('speakers', @speaker)/@name"/></td>
          <td><xsl:value-of select="@startTime" /></td>
        </tr>
      </xsl:for-each>
    </table>
  </xsl:template>
</xsl:stylesheet>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...