Как я могу предоставить одну и ту же форму 1) пустую и 2) заполненную через XSLT?

У меня есть 20 форм, которые я печатаю с использованием XML и XSLT. Теперь мне нужна функциональность, с помощью которой я могу печатать эти формы как пустые. Например, у меня есть поле «Имя» в моем XML и соответствующий

<span>Name:</span>
<strong class="data">
    <xsl:value-of disable-output-escaping="yes" select="Name" />
</strong>

Мне нужны 2 функции:

  1. Я хочу напечатать имя, например: Name: John Doe
  2. Я не хочу печатать имя и позволять пользователю заполнять, например: Name:________

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

Кто-нибудь знает, как это можно реализовать?

Спасибо


person Mithil    schedule 06.04.2009    source источник
comment
Интересный вопрос! Вы собираетесь использовать один и тот же XSLT для обоих сценариев или разные для пустой формы?   -  person Cerebrus    schedule 06.04.2009
comment
да, я не хочу снова воссоздавать xslt.   -  person Mithil    schedule 06.04.2009
comment
Означает ли это, что вы хотите иметь дополнительный шаблон, который еще раз преобразует уже имеющийся у вас вывод, добавляя пробелы там, где их не хватает?   -  person Tomalak    schedule 06.04.2009


Ответы (2)


Для создания заготовок нужной длины вы можете:

<!-- make sure you put in more blanks than you'll need -->
<xsl:variable name="blanks" select="'___[...100 blanks...]___'" />

<!-- and later -->

<xsl:value-of select="substring($blanks, 1, @fieldlength)" />

Or

<xsl:template name="create-blanks">
  <xsl:param name="todo" select="0" />

  <xsl:if test="$todo &gt; 0">
    <xsl:text>_</xsl:text>
    <xsl:call-template name="create-blanks">
      <xsl:with-param name="todo" select="$todo - 1" />
    </xsl:call-template>
  </xsl:choose>
</xsl:template>

<!-- and later -->

<xsl:variable name="blanks">
  <xsl:call-template name="create-blanks">
    <xsl:with-param name="todo" select="@fieldlength" />
  </xsl:call-template>
</xsl:variable>

<xsl:value-of select="$blanks" />

С точки зрения производительности первый подход явно предпочтительнее. Последнее можно несколько улучшить, создавая каждый раз более одного пробела (например, 10) и вызывая его не @fieldlength, а ceiling(@fieldlength div 10) раза, используя substring() на результате. Этот расчет, конечно, может происходить в самом шаблоне.

Если разумный максимум пробелов не может быть заранее определен (я думаю, что это несколько маловероятно для вашего случая), последний метод гарантирует, что вы никогда не «исчерпаете».

person Tomalak    schedule 06.04.2009
comment
Спасибо за ответ, но я не хочу просматривать все свои xslts (их около 80 с лишним) и вносить это изменение. Кроме того, если есть текстовая область, мне нужно пару пробелов. - person Mithil; 06.04.2009
comment
Итак, что именно делаете вы хотите? Как вы хотите изменить вывод, если вы не собираетесь менять XSLT? - person Tomalak; 06.04.2009
comment
в основном я думал, что я создаю пустой xml для всех своих форм, а затем, в зависимости от размера поля каждого поля, я добавляю соответствующее количество пробелов. Имеет ли это хоть какой-то смысл? - person Mithil; 06.04.2009
comment
Еще нет. Я вижу точки, но не могу их соединить. Что у вас есть (пример кода?) и, исходя из этого, что вам нужно? - person Tomalak; 06.04.2009

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

<span>Name:</span>
<strong class="data">
    <xsl:choose>
        <xsl:when test="string-length(Name) > 0">
            <xsl:value-of disable-output-escaping="yes" select="Name" />
        </xsl:when>
        <xsl:otherwise>
            _____________________________
        </xsl:otherwise>
    </xsl:choose>
</strong>

Таким образом, вы просто передаете пустой XML-документ, и таблица стилей распечатает его как таковой.

person Steve    schedule 06.04.2009
comment
Спасибо за ответ, но я не хочу просматривать все свои xslts (их около 80 с лишним) и вносить это изменение. Кроме того, если есть текстовая область, мне нужно пару пробелов. - person Mithil; 06.04.2009