Подавить запятую с помощью xslt - PullRequest
0 голосов
/ 29 ноября 2018

У меня есть этот XSL:

  <xsl:for-each select="Name">
    <xsl:if test="@Highlight='true'">
      <td>
        <xsl:variable name="iColumnIndex" select="position()+1" />
        <xsl:value-of select="/SRRScheduleData/Columns/Heading[$iColumnIndex]"/>
        <xsl:text>, </xsl:text>
      </td>
    </xsl:if>
  </xsl:for-each>

XML-вопрос прост:

<Name Highlight="false" Conflict="false">Name 1</Name>
<Name Highlight="false" Conflict="false">Name 2</Name>
<Name Highlight="true" Conflict="false">Name 3</Name>
<Name Highlight="false" Conflict="false">Name 4</Name>
<Name Highlight="false" Conflict="false">Name 5</Name>
<Name Highlight="true" Conflict="false">Name 3</Name>

Столбцы XML выглядят так:

<Columns>
    <Heading TextAlign="left" Width="11%">Date</Heading>
    <Heading TextAlign="left" Width="11%">Hall Attendant</Heading>
    <Heading TextAlign="left" Width="11%">Car Park</Heading>
    <Heading TextAlign="left" Width="11%">Sound</Heading>
    <Heading TextAlign="left" Width="11%">Platform</Heading>
    <Heading TextAlign="left" Width="11%">Mic Left</Heading>
    <Heading TextAlign="left" Width="11%">Mic Right</Heading>
    <Heading TextAlign="left" Width="11%">Chairman</Heading>
    <Heading TextAlign="left" Width="11%">Watchtower Reader</Heading>
</Columns>

Длявывод, который я надеялся получить для назначений:

Назначение X, Назначение Y

в той же строке с запятой, разделяющей их.

Но я получаю следующее:

Назначение X, Назначение Y,

Я понимаю, почему это происходит.Сначала я подумал об использовании <xsl:for-each select="Name[@Highlight='true']">, а затем я мог бы использовать значение position() и, если оно равно 1, просто вывести присвоение, в противном случае выведите ", Assignment".

Пока это будет работать,он падает, когда я пытаюсь отобразить описание назначения.Я должен использовать физическую позицию объекта имени в AssignmentRow, чтобы найти правильное значение заголовка столбца.Если я использую фильтрацию с for-each, я потеряю эти позиции индекса столбца.

Вот почему я остановился на циклическом преобразовании всех имен, чтобы у меня было правильное значение позиции, которое можно использовать для поиска назначения.Компромисс в том, что я теперь не знаю, когда я нашел первый экземпляр, где Highlight установлен в true.

Так есть ли способ подавить эту запятую, если она присутствует?

1 Ответ

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

Есть несколько способов, которыми вы можете подойти к этому:

  1. Используйте предикат в вашем xsl:for-each (как вы сказали, вы думали делать вначале), и используйте count(preceding-sibling::Name) длявычислить номер индекса.

  2. Проверить наличие following-sibling::Name[[@Highlight='true']" для обнаружения последнего узла и не выводить запятую, когда он есть.

  3. Используйте временную переменную для хранения выделенных имен вместе с их (исходным) положением.Затем обработайте переменную.


Я должен добавить, что параметры # 1 и # 2 более дороги с точки зрения производительности (требующих повторного тестирования по осям одного уровня), в то время как третийопция потребует больше кодирования.

...