Выберите узел для итерации через XSL - PullRequest
0 голосов
/ 12 февраля 2011

Я нахожусь в процессе разработки шлюза «Бесплатная корзина», в котором каждый элемент хранится в формате XML

. Поэтому, учитывая следующую структуру XML

<basket>
    <item id="1">
        <item-title>value</item-title>
        <item-description>value</item-description>
        <item-quanity>value</item-quanity>
        <item-price>value</item-price>
        <item-on>value</item-on>
        <item-os>value</item-os>
        <item-on>value</item-on>
        <item-os>value</item-os>
        <item-on>value</item-on>
        <item-os>value</item-os>
    </item>
    <item id="2">
        <item-title>value</item-title>
        <item-description>value</item-description>
        <item-quanity>value</item-quanity>
        <item-price>value</item-price>
        <item-on>value</item-on>
        <item-os>value</item-os>
        <item-on>value</item-on>
        <item-os>value</item-os>
    </item>
</basket>

Можно ли через XSL выбратьтолько узлы опций для элемента

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

в тот момент, когда я используюэта структура XML

<item id="1">
    <options>
        <option index="0">
            <on>Color</on>
            <os>Blue</os>
        </option>
        <option index="1">
            <on>Size</on>
            <os>5</os>
        </option>
    </options>
    <quantity>1</quantity>
    <item-name>Skate Board Trainers</item-name>
    <item-description>0011005</item-description>
    <unit-price>1.00</unit-price>
    <item-img>images/skate.gif</item-img>
    <item-url>http://cgdomestics2-co-uk.server9.controldns.co.uk/dev3/</item-url>
</item>
<item id="2">
    <options>
        <option index="0">
            <on>Color</on>
            <os>Blue</os>
        </option>
    </options>
    <quantity>1</quantity>
    <item-name>Tattoo Bottle Cap Belt - Recycled</item-name>
    <item-description>0011w346</item-description>
    <unit-price>1.00</unit-price>
    <item-img>images/belt.gif</item-img>
    <item-url>http://cgdomestics2-co-uk.server9.controldns.co.uk/dev3/</item-url>
</item>

Таким образом, в XSL я могу просто выбрать узел параметров и выполнить итерации вокруг них, но для создания этой структуры сделайте преобразование формы в XML действительно завершенным и надеемся, что это будет проще изXSL

Ответы [ 2 ]

1 голос
/ 12 февраля 2011

С более классическим подходом XSLT эта таблица стилей:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="node()|@*">
        <xsl:copy>
            <xsl:apply-templates select="node()|@*"/>
        </xsl:copy>
    </xsl:template>
    <xsl:template match="item-os"/>
    <xsl:template match="item-on">
        <option index="{count(preceding-sibling::item-on)+1}">
            <xsl:apply-templates
                 select=".|following-sibling::*[1]/self::item-os"
                 mode="output"/>
        </option>
    </xsl:template>
    <xsl:template match="*" mode="output">
        <xsl:element name="{substring-after(name(),'item-')}">
            <xsl:apply-templates select="node()|@*"/>
        </xsl:element>
    </xsl:template>
</xsl:stylesheet>

Выход:

<basket>
    <item id="1">
        <item-title>value</item-title>
        <item-description>value</item-description>
        <item-quanity>value</item-quanity>
        <item-price>value</item-price>
        <option index="1">
            <on>value</on>
            <os>value</os>
        </option>
        <option index="2">
            <on>value</on>
            <os>value</os>
        </option>
        <option index="3">
            <on>value</on>
            <os>value</os>
        </option>
    </item>
    <item id="2">
        <item-title>value</item-title>
        <item-description>value</item-description>
        <item-quanity>value</item-quanity>
        <item-price>value</item-price>
        <option index="1">
            <on>value</on>
            <os>value</os>
        </option>
        <option index="2">
            <on>value</on>
            <os>value</os>
        </option>
    </item>
</basket>

Примечание : ввод правил копирования идентичности как есть. правило "item-on" выводит элемент option, имеющий @index с AVT, и обрабатывает self и следующий брат, если это элемент item-so в режиме "output" Пустое правило "item-so". Правило «любой элемент в режиме output», генерирует элемент с динамическим именем и применяет шаблоны.

0 голосов
/ 12 февраля 2011

Вы можете использовать following-sibling.

Входной XML:

<?xml version="1.0" encoding="utf-8" ?>
<basket>
  <item id="1">
    <item-title>Item 1</item-title>
    <item-on>Color</item-on>
    <item-os>Blue</item-os>
    <item-on>Size</item-on>
    <item-os>5</item-os>
  </item>
  <item id="2">
    <item-title>Item 2</item-title>
    <item-on>Color</item-on>
    <item-os>Red</item-os>
  </item>
</basket>

XSLT:

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

  <xsl:template match="/">
    <basket>
      <xsl:for-each select="basket/item">
        <item id="{@id}">
          <item-title><xsl:value-of select="item-title"/></item-title>
          <options>
            <xsl:for-each select="item-on">
              <option>
                <on><xsl:value-of select="."/></on>
                <os><xsl:value-of select="following-sibling::item-os"/></os>
              </option>
            </xsl:for-each>
          </options>
        </item>
      </xsl:for-each>
    </basket>
  </xsl:template>
</xsl:stylesheet>

Выход:

<?xml version="1.0" encoding="utf-8"?>
<basket>
  <item id="1">
    <item-title>Item 1</item-title>
    <options>
      <option>
        <on>Color</on>
        <os>Blue</os>
      </option>
      <option>
        <on>Size</on>
        <os>5</os>
      </option>
    </options>
  </item>
  <item id="2">
    <item-title>Item 2</item-title>
    <options>
      <option>
        <on>Color</on>
        <os>Red</os>
      </option>
    </options>
  </item>
</basket>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...