XSL вложено для каждой задачи - PullRequest
1 голос
/ 26 июля 2010

привет, привет

Хорошо, мой вопрос, я пытаюсь разработать корзину покупок с открытым исходным кодом, которая использует xml для хранения и xsl для оформления корзины

1, мой xml

<items>
    <item>
        <item-name>vlaue</item-name>
        <item-number>vlaue</item-number>
        <quantity>vlaue<quantity>
        <option>
            <on0>vlaue</on0>
            <os0>vlaue</os0>
            <on1>vlaue</on1>
            <os1>vlaue</os1>
        </option>
    </item>
</items>

Этот xml будет создан для элемента с 2 вариантами Так как PayPal допускает максимум 7 опций, моя верхняя фигура станет моей хорошо, мой xsl

<xsl:for-each select="item">
    <input type='hidden' name="item_name_{position()}" value="{item-name}"/>
    <input type='hidden' name="item_number_{position()}" value="{item-description}"/>
    <input type='hidden' name="amount_{position()}" value="{unit-price}"/>
    <input type='hidden' name="quantity_{position()}" value="{@quantity}"/>
    <xsl:for-each select="option">            
        <input type='hidden' name="on{position()}_(i need this to be item postion)" value="(i need this to be "on" with the option postion appened ie "on0")"/>
        <input type='hidden' name="os{position()}_{i need this to be item postion}" value="(i need this to be "os" with the option postion appened ie "os0")"/>
    </xsl:for-each>
</xsl:for-each>

Так что на самом деле я спрашиваю: могу ли я получить значение позы из внешнего для каждого, переданного во внутреннее для каждого

если кто-то может помочь, это будет здорово

Заранее спасибо

Тим Доджсон

Ответы [ 3 ]

1 голос
/ 26 июля 2010

Я не уверен на 100%, что полностью понимаю, как XSLT относится к опубликованному вами XML. Я думаю, что имеет смысл отредактировать ваш вопрос, чтобы вы четко указали:

  • что такое входной XML
  • каков желаемый вывод XML
  • с каким XSLT вы боретесь

(вероятно, мне следует спросить об этом в комментарии, но в настоящее время я должен собрать достаточно кредитов, чтобы сделать это ...)

Отвечая на ваш основной вопрос (абстрагируясь от моих заблуждений): вы всегда можете передавать такую ​​информацию о местоположении через переменные. Просто назначьте положение элемента контекста во внешнем for-each переменной и обратитесь к этой переменной во внутреннем for-each. Насколько я понимаю вашу таблицу стилей XSLT, я предполагаю, что вы ищете что-то вроде этого:

<xsl:for-each select="item">
    <xsl:variable name="itemPos" select="position()"/>
    <input type='hidden' name="item_name_{position()}" value="{item-name}"/>
    <input type='hidden' name="item_number_{position()}" value="{item-description}"/>
    <input type='hidden' name="amount_{position()}" value="{unit-price}"/>
    <input type='hidden' name="quantity_{position()}" value="{@quantity}"/>
    <xsl:for-each select="option/*">            
        <input type='hidden' name="{name()}_{$itemPos}" value="{.}"/>
    </xsl:for-each>
</xsl:for-each>

Позиция элемента контекста во внешнем for-each хранится в переменной $ itemPos, на которую можно ссылаться в дальнейшем.

С уважением,

Рон

0 голосов
/ 27 июля 2010

Ваш вопрос не ясен, но я думаю, вам нужно что-то вроде этой таблицы стилей:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="items">
        <form>
            <xsl:apply-templates/>
        </form>
    </xsl:template>
    <xsl:template match="item|option" priority="1">
        <xsl:param name="pos" select="position()"/>
        <xsl:apply-templates select="*">
            <xsl:with-param name="pos" select="$pos"/>
        </xsl:apply-templates>
    </xsl:template>
    <xsl:template match="item/*|option/*">
        <xsl:param name="pos"/>
        <input type='hidden' name="{name()}_{$pos}" value="{.}"/>
    </xsl:template>
</xsl:stylesheet>

При правильном вводе:

<items>
    <item>
        <item-name>vlaue</item-name>
        <item-number>vlaue</item-number>
        <quantity>vlaue</quantity>
        <option>
            <on0>vlaue</on0>
            <os0>vlaue</os0>
            <on1>vlaue</on1>
            <os1>vlaue</os1>
        </option>
    </item>
</items>

Выход:

<form>
    <input type="hidden" name="item-name_1" value="vlaue" />
    <input type="hidden" name="item-number_1" value="vlaue" />
    <input type="hidden" name="quantity_1" value="vlaue" />
    <input type="hidden" name="on0_1" value="vlaue" />
    <input type="hidden" name="os0_1" value="vlaue" />
    <input type="hidden" name="on1_1" value="vlaue" />
    <input type="hidden" name="os1_1" value="vlaue" />
</form>

Примечание : сопоставление с образцом позволяет использовать повторно. @ Приоритет для разрешения конфликтов item/* и option без использования восстановления после ошибок. Добавление фиктивной form для корректного вывода (на самом деле это не обязательно с полной таблицей стилей)

0 голосов
/ 26 июля 2010

Если честно, я бы пересмотрел дизайн вашего XML; иметь числовой индекс как часть имени тега обычно не рекомендуется, так как это значительно усложняет работу в схемах xslt или xsd. Я бы порекомендовал что-то вроде:

    <option>
        <on index="0">vlaue</on>
        <os index="0">vlaue</os>
        <on index="1">vlaue</on>
        <os index="1">vlaue</os>
    </option>

Затем вы можете просто взять позицию из атрибута @index, и вы также можете сделать <foreach select="os">, чтобы перебрать только все элементы os, например.

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