Задача XSLT: реплицировать список элементов для каждого элемента другого списка с исключениями - PullRequest
0 голосов
/ 18 июля 2011

У меня возникли проблемы при попытке настроить шаблон для решения этой ситуации:

Мой XML выглядит так:

<root>
     <recordset name="companies">
               <record>
                    <id>1</id>
                    <description>Company 1</description>
               </record>
               <record><id>2</id><description>Company 2</description></record>
               ...
               <record><id>n</id><description>Company n</description></record>
     </recordset>
     <gruppi>
          <supplier>
               <agreement>1</agreement>
               <company>
                    <id>3</id>
                    <description>Compoany 3</description>
               </company>
               <company>
                    <id>7</id>
                    <description>Company 7</description>
               </company>
          </supplier>
          ... <!-- a lot of supplier --> ...
          <supplier>
               <agreement>3</agreement>
               <company>
                    <id>1</id>
                    <description>Company 1</description>
               </company>
               <company>
                    <id>18</id>
                    <description>Company 18</description>
               </company>
          </supplier>
     </gruppi>        
</root>

Моя цель - создать шаблон, способный выполнять следующую обработку: для каждого поставщика в группе я хочу вывести список всех записей в пределах набора записей name = "companies", КРОМЕ для записи, идентификатор которой уже содержится в id элемент потомок текущего элемента поставщика.

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

Я пытался использовать xsl: key и некоторую рекурсию, но я нашел эту задачу довольно сложной, и у меня заканчиваются идеи. У кого-нибудь есть подсказка для решения этой проблемы?

Спасибо за любую помощь!

@ polishchuk: входной файл xml довольно большой, поэтому я извлек интересующую меня структуру с небольшим количеством общих данных. По поводу вывода я ищу что-то вроде этого:

<h1>Agreement: 1</h1>
<select>
     <option value="1"></option>
          ....                                                  <!-- WITHOUT values 3 and 7 -->
     <option value="N"></option>
</select>

<h1>Agreement: 3</h1>
<select>
     <option value="1"></option>
          ....                                                  <!-- WITHOUT values 1 and 18 -->
     <option value="N"></option>
</select>

1 Ответ

0 голосов
/ 18 июля 2011

XSLT:

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

    <xsl:template match="/">
        <xsl:apply-templates select="//supplier"/>
    </xsl:template>

    <xsl:template match="supplier">
        <h1>
            <xsl:text>Agreement:&#xA0;</xsl:text>
            <xsl:value-of select="agreement"/>
        </h1>
        <select>
            <xsl:for-each select="//recordset[@name = 'companies']/record[not(id = current()/company/id)]">
                <option value="{id}">
                    <xsl:value-of select="id"/>
                </option>
            </xsl:for-each>
        </select>
    </xsl:template>
</xsl:stylesheet>

Предполагаемый XML:

<root>
    <recordset name="companies">
        <record>
            <id>1</id>
            <description>Company1</description>
        </record>
        <record>
            <id>2</id>
            <description>Company2</description>
        </record>
        <record>
            <id>3</id>
            <description>Company3</description>
        </record>
        <record>
            <id>4</id>
            <description>Company4</description>
        </record>
        <record>
            <id>5</id>
            <description>Company5</description>
        </record>
    </recordset>
    <gruppi>
        <supplier>
            <agreement>1</agreement>
            <company>
                <id>1</id>
            </company>
            <company>
                <id>2</id>
            </company>
        </supplier>
        <supplier>
            <agreement>2</agreement>
            <company>
                <id>1</id>
            </company>
            <company>
                <id>3</id>
            </company>
        </supplier>
        <supplier>
            <agreement>3</agreement>
            <company>
                <id>4</id>
            </company>
            <company>
                <id>5</id>
            </company>
        </supplier>
    </gruppi>
</root>

Выход:

<h1>Agreement: 1</h1>
<select>
  <option value="3">3</option>
  <option value="4">4</option>
  <option value="5">5</option>
</select>
<h1>Agreement: 2</h1>
<select>
  <option value="2">2</option>
  <option value="4">4</option>
  <option value="5">5</option>
</select>
<h1>Agreement: 3</h1>
<select>
  <option value="1">1</option>
  <option value="2">2</option>
  <option value="3">3</option>
</select>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...