XSLT logi c для выбора между значениями, если они есть - PullRequest
0 голосов
/ 17 марта 2020

Мне нужно написать XSLT logi c, чтобы выбирать между различными элементами в зависимости от наличия. Например,

<Box>
    <Thing>
        <Title>Toy</Title>
        <Value>1</Value>
    </Thing>
    <Thing>
        <Title>Towel</Title>
        <Value>2</Value>
    </Thing>
</Box>

Если присутствует «вещь» с заголовком «Полотенце», значение «Коробка» становится равным 2. Если «Полотенце» нет, выбирается «вещь» с заголовком «Игрушка». 'и значение "Box" становится равным 1.

Таким образом, вывод сверху будет

<Box>
    2
</Box>

Где вывод

<Box>
    <Thing>
        <Title>Toy</Title>
        <Value>1</Value>
    </Thing>
</Box>

будет

<Box>
    1
</Box>

«Вещи» могут быть в любом порядке, поэтому

<Box>
    <Thing>
        <Title>Towel</Title>
        <Value>2</Value>
    </Thing>
    <Thing>
        <Title>Toy</Title>
        <Value>1</Value>
    </Thing>
</Box>

будет по-прежнему иметь значение

<Box>
    2
</Box>

, потому что полотенце будет выбрано над игрушкой, если это присутствует Моя мысль в том, что я должен сделать для каждого l oop, но я действительно совершенно потерян.

Спасибо

1 Ответ

1 голос
/ 17 марта 2020

Я бы соответствовал Box и заполнил его желаемым значением, либо поместив условия в разные шаблоны с желаемым приоритетом

<xsl:stylesheet
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    version="1.0">

  <xsl:template match="@* | node()">
    <xsl:copy>
      <xsl:apply-templates select="@* | node()"/>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="Box[Thing/Title = 'Towel']" priority="5">
      <xsl:copy>
          <xsl:value-of select="Thing[Title = 'Towel']/Value"/>
      </xsl:copy>
  </xsl:template>

  <xsl:template match="Box[Thing/Title = 'Toy']">
      <xsl:copy>
          <xsl:value-of select="Thing[Title = 'Toy']/Value"/>
      </xsl:copy>
  </xsl:template>

</xsl:stylesheet>

См. https://xsltfiddle.liberty-development.net/pNmC4HL/0, https://xsltfiddle.liberty-development.net/pNmC4HL/1 и https://xsltfiddle.liberty-development.net/pNmC4HL/2 для ваших примеров.

Или вы можете использовать один шаблон и xsl:choose/xsl:when тесты внутри.

Для При обоих подходах неясно, что вы хотите сделать, если оба ваших условия не выполнены или что должно происходить с другими элементами входных данных. Но адаптация шаблона преобразования идентификаторов или, если есть только этот элемент Box, удаление его и использование шаблона (ов), соответствующих Box, должны решить преобразование для этих элементов.

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