Как установить уникальное имя для каждого выбора HTML с помощью XSLT? - PullRequest
0 голосов
/ 04 мая 2018

Я создаю HTML From с XML и XSLT, затем после того, как Пользователь отправит его, я хочу сохранить его в новом XML с помощью php. Прямо сейчас без уникальных имен у меня проблема с доступом к данным через $ _POST. Так что в основном я хочу уникальное имя для каждого из моих select в каждом div, но я не знаю, как это сделать, поэтому, пожалуйста, помогите ...

Прямо сейчас у меня 3 раза
select name="Correct" select name="ErrorOne" select name="ErrorTwo"
и я хочу:
select name="Correct1" select name="ErrorOne1" select name="ErrorTwo1"
select name="Correct2" select name="ErrorOne2" select name="ErrorOne2"
и т.д ...

Моя форма и эффект, который я ищу (красная линия - что мне нужно) form

Мой XML

<?xml version="1.0" encoding="UTF-8"?>
<labels>
    <tags>
        <tag type="Tag1"/>
        <tag type="Tag2"/>
        <tag type="Tag3"/>
    </tags>
    <statuses>
        <status type="Correct">
            <answer description=""/>
            <answer description="Y"/>
            <answer description="N"/>
        </status>
        <status type="ErrorOne">
            <answer description=""/>
            <answer description="whyyy"/>
            <answer description="also this"/>
            <answer description="and THIS!"/>
            <answer description="unknown"/>
        </status>
        <status type="ErrorTwo">
            <answer description=""/>
            <answer description="whyyy"/>
            <answer description="also this"/>
            <answer description="and THIS!"/>
            <answer description="unknown"/>
        </status>
    </statuses>
</labels>

Мой XSLT

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

    <xsl:template match="/">
        <form method="POST" action="scripts/form.php">

            <div class="mainC">
                <xsl:apply-templates select="/labels/tags"/> 
            </div>
            <input type="hidden" name="hidden" id="linkData"/>
        </form>
    </xsl:template>

    <xsl:template match="tags/tag">
            <div class="columnDiv">
                <h3><xsl:value-of select="@type"/></h3>
                <xsl:apply-templates select="/labels/statuses"/>
            </div>
    </xsl:template>

     <xsl:template match="status">
        <div class="subDiv">
            <label><xsl:value-of select ="@type"/></label>
            <select name="{@type}">
                <xsl:apply-templates select="./answer"/>
            </select>
        </div>
    </xsl:template>

     <xsl:template match="answer">
            <option name="{@description}"><xsl:value-of select="@description"/></option>
    </xsl:template>

</xsl:stylesheet>

Ответы [ 2 ]

0 голосов
/ 04 мая 2018

Вы можете использовать функцию position () , чтобы найти позицию текущего элемента <tag> в его родительском элементе, давая вам 1, 2, 3 ... для каждого тега.

Единственное препятствие заключается в том, что вам нужно оценить position() в шаблоне tag (потому что именно здесь <tag> является узлом контекста), а затем передать значение в шаблон status в качестве параметра , Кроме того, чтобы position() подсчитывал, на каком <tag> вы находитесь в <tags>, вам нужно изменить match= шаблона tag, чтобы он соответствовал только <tag>, и вызывать этот шаблон в контексте <tags> родительский узел.

Итак, шаблон верхнего уровня выглядит так:

<xsl:template match="/labels/tags">
    <form method="POST" action="scripts/form.php">
        <div class="mainC">
            <xsl:apply-templates select="tag"/> 
        </div>
        <input type="hidden" name="hidden" id="linkData"/>
    </form>
</xsl:template>

... а затем шаблон tag:

<xsl:template match="tag">
    <div class="columnDiv">
        <h3><xsl:value-of select="@type"/></h3>
        <xsl:apply-templates select="/labels/statuses">
            <xsl:with-param name="pos" select="position()" />
        </xsl:apply-templates>
    </div>
</xsl:template>

... и шаблон status выглядит следующим образом:

<xsl:template match="status">
    <xsl:param name="pos" />
    <div class="subDiv">
        <label><xsl:value-of select ="@type"/></label>
        <select name="{@type}{$pos}">
            <xsl:apply-templates select="./answer"/>
        </select>
    </div>
</xsl:template>
0 голосов
/ 04 мая 2018

Когда вы сопоставляете status элементы с select элементами, используйте

<xsl:template match="status">
    <div class="subDiv">
        <label><xsl:value-of select ="@type"/></label>
        <xsl:variable name="n"><xsl:number/></xsl:variable>
        <select name="Correct{$n}">
            <xsl:apply-templates select="./answer"/>
        </select>
    </div>
</xsl:template>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...