Преобразование текста в перекрестную ссылку в XSL - PullRequest
0 голосов
/ 25 сентября 2018

Я видел много информации о том, как разбивать перекрестные ссылки XML в XSL (например, перекрестная ссылка XSL ).Я полностью застрял на том, как сделать противоположное.Я даже не знаю, как это технически называется, поэтому я не знаю, где искать.

Учитывая XML

<shoes>
  <shoe>
    <colour>brown</colour>
    <make>Shoeco</make>
  </shoe>
  <shoe>
    <colour>black</colour>
    <make>Shoeco</make>
  </shoe>
  <shoe>
    <colour>purple</colour>
    <make>Footfine</make>
  </shoe>
  <shoe>
    <colour>brown</colour>
    <make>Footfine</make>
  </shoe>
  <shoe>
    <colour>blue</colour>
    <make>Leathers</make>
  </shoe>
</shoes>

Я хочу вывод

<inventory>
  <shoelist>
    <item>
      <colour>brown</colour>
      <shopref>1</shopref>
    </item>
    <item>
      <colour>black</colour>
      <shopref>1</shopref>
    </item>
    <item>
      <colour>purple</colour>
      <shopref>1</shopref>
    </item>
    <item>
      <colour>brown</colour>
      <shopref>2</shopref>
    </item>
    <item>
      <colour>blue</colour>
      <shopref>2</shopref>
    </item>
  </shoelist>
  <shoeshops>
    <shop>
      <refno>1</refno>
      <name>ShoeCo</name>
    </shop>
    <shop>
      <refno>2</refno>
      <name>FootFine</name>
    </shop>
    <shop>
      <refno>3</refno>
      <name>Leathers</name>
    </shop>
  </shoeshops>
</inventory>

Как можно (а) создать список каждого уникального обувного магазина с увеличивающимся идентификационным номером и (б) ссылаться на правильный обувной магазин по идентификационному номеру в каждом элементе обуви?

1 Ответ

0 голосов
/ 25 сентября 2018

Сначала я создам список магазинов обуви в переменной:

<xsl:variable name="shops">
  <shoeshops>
    <xsl:for-each-group select="shoe" group-by="make">
      <shop>
        <refno>{position()}</refno>
        <name>{current-grouping-key()}</name>
      </shop>
    </xsl:for-each-group>
  </shoeshops>
</xsl:variable>

Затем создадим shoelist:

<xsl:mode on-no-match="shallow-copy"/>
<inventory>
   <shoelist>
     <xsl:apply-templates select="shoes/shoe"/>
   </shoelist>
   <xsl:copy-of select="$shops"/>
</inventory>

<xsl:template match="make">
  <shopref>{$shops//shop[name="current()"]/refno}</shopref>
</xsl:template> 

Для краткости используются некоторые конструкции XSLT 3.0.Конвертировать в XSLT 2.0 довольно легко, а конвертировать в XSLT 1.0 гораздо сложнее.

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