Показать товары по категории xml - PullRequest
1 голос
/ 24 июня 2009

У меня есть вывод xml, подобный этому:

<data>
    <item-types>
        <entry id="1" items="5">
            <category>Frozen</category>
        </entry>
        <entry id="2" items="4">
            <category>Breakfast</category>
        </entry>
    </item-types>

    <items>
        <entry id="28">
            <item-number>1115</item-number>
            <name>Marion Berries, IQF</name>
            <area>
                <item id="1">Groceries - Frozen</item>
            </area>
        </entry>
        <entry id="29">
            <item-number>1117</item-number>
            <name>Peach Cups</name>
            <area>
                <item id="1">Groceries - Frozen</item>
            </area>
        </entry>
        <entry id="35">
            <item-number>1570</item-number>
            <name>Sausage Patty</name>
            <area>
                <item id="2">Groceries - Breakfast</item>
            </area>
        </entry>
        <entry id="32">
            <item-number>1575</item-number>
            <name>French Toast Stix, WG</name>
            <area>
                <item id="2">Groceries - Breakfast</item>
            </area>
        </entry>
    </items>
</data>

items-types - категории пунктов ниже. item-types/entry/@id относится непосредственно к items/entry/area/item/@id, и я пытаюсь упорядочить элементы по категориям для вывода.

Пока что я использую следующее XSL-преобразование.

<xsl:template match="item-types/entry">
    <h3><xsl:value-of select="concat(@id,'. ',category)" /></h3>
    <ul>
        <xsl:apply-templates select="/data/items/entry[area/item/@id = @id]" />
    </ul>
</xsl:template>
<xsl:template match="items/entry">
    <li>
        <xsl:value-of select="concat(item-number,'. ',name,' (',area/item/@id,')')" />
    </li>
</xsl:template>

Проблема в том, что он не работает. Я считаю, что проблема заключается в предикате в строке 4 преобразования: [area/item/@id = @id] Когда я удаляю это, он показывает все элементы в каждой категории.

Есть ли способ показать предметы "Замороженные" в категории "Замороженные" и предметы "Завтрак" в категории "Завтрак"?

Спасибо!

1 Ответ

4 голосов
/ 24 июня 2009

Легко делается с помощью ключа XSL.

<xsl:key name="kEntryByAreaId" match="items/entry" use="area/item/@id" />

<!-- this is just for the sake of the test -->
<xsl:template match="/data">
  <xsl:apply-templates select="item-types/entry" />
</xsl:template>

<xsl:template match="item-types/entry">
  <h3>
    <xsl:value-of select="concat(@id,'. ',category)" />
  </h3>
  <ul>
    <xsl:apply-templates select="key('kEntryByAreaId', @id)" />
  </ul>
</xsl:template>

<xsl:template match="items/entry">
  <li>
    <xsl:value-of select="
      concat(
        item-number, 
        '. ', name,
        ' (', area/item/@id, ')'
      )
    " />
  </li>
</xsl:template>

Теперь, чтобы ответить на вопрос, почему ваша попытка не сработала.

Это выражение:

/data/items/entry[area/item/@id = @id]

говорит: «все элементы /data/items/entry имеют значение area/item/@id, равное значению @id» Проблема в том, что они не имеют значения @id.

Что вы имеете в виду это:

/data/items/entry[area/item/@id = current()/@id]

Это будет работать, но ключ будет быстрее.

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