Отображение данных из XML в поле выбора с использованием XSLT

#xml #xslt #select #field

#xml #xslt #выберите #поле

Вопрос:

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

 <?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="test2.xsl"?>
<root>
<radiobuttons>
    <radio1>Y</radio1>
    <blurb>blahblahblah</blurb>
    <hidden>N</hidden>
    <check1>Y</check1>
    <select1>3</select1>
</radiobuttons>
</root>
  

Ниже приведен XSLT, который я использую с этим XML. Я настроил как флажки, так и переключатели, чтобы проверять себя в зависимости от данных в XML с помощью команд xsl:if. Тестовый скрытый div также отображает зависящие от XML данные, используя тот же xsl:if . Поле ввода просто отображает XML-данные, на которые оно предназначено.

 <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="html" indent="yes" omit-xml-declaration="no"
            encoding="UTF-8"/>
<xsl:template match="/">
<HTML>
<BODY>
<form>
<xsl:apply-templates select="root"/>
</form>
</BODY>
</HTML>
</xsl:template>

<xsl:template match="root">

<input type="radio" name="radio1" value="Y" >
<xsl:if test="radiobuttons/radio1='Y'">
<xsl:attribute name="checked">checked</xsl:attribute></xsl:if>
</input>Radio Button 1

<input type="radio" name="radio1" value="N" >
<xsl:if test="radiobuttons/radio1='N'">
<xsl:attribute name="checked">checked</xsl:attribute></xsl:if>
</input>Radio Button 2

<div> <xsl:if test="radiobuttons/hidden='N'">
<xsl:attribute name="style">display:none</xsl:attribute></xsl:if> Yaddah Yaddah Yaddah
</div>

<input type="checkbox" name="check1" value="Y">
<xsl:if test="radiobuttons/check1='Y'">
<xsl:attribute name="checked">checked</xsl:attribute></xsl:if>
</input>Checkbox test

<label for="select1">select1:</label>
<select id="select1" ><xsl:value-of select="radiobuttons/select1"></xsl:value-of>
  <option value="1">1</option>  <option value="2">2</option>  <option value="3">3</option>  <option value="4">4</option>
  </select>
  <br></br>

<br/>
<input name="blurb" type="text" id="blurb" value="{./radiobuttons/blurb}"></input>
</xsl:template>
</xsl:stylesheet>
  

Однако я не думаю, что смогу корректно использовать функцию поля выбора, используя xsl:if, потому что оно логическое. Я думаю, что, вероятно, я мог бы написать команду xsl:if для каждого параметра, которая привела бы к желаемому результату, однако это кажется очень грубым способом заставить эту работу работать, и я уверен, что для этого должно быть гораздо более элегантное решение. Я также не добился успеха, заставив его работать с использованием метода value для поля ввода.

Из приведенных выше примеров кодов я бы хотел, чтобы в поле выбора отображался 3-й вариант, как указано в XML. Может ли кто-нибудь предложить или, что еще лучше, привести мне пример того, как я мог бы закодировать поле выбора в моем XSLT, которое будет вести себя так, как описано выше? Любая помощь будет принята с благодарностью!

Ответ №1:

Что вы могли бы сделать, так это поместить все четыре параметра для вашего оператора select в ваш XSLT, чтобы он действовал как своего рода справочная таблица (где мое пространство имен должно быть определено в верхней части вашего XSLT)

 <my:options> 
  <option>1</option> 
  <option>2</option> 
  <option>3</option> 
  <option>4</option> 
</my:options> 
  

Затем, чтобы получить доступ к этим параметрам в XSLT, вы можете создать переменную, например, так…

 <xsl:variable name="options" select="document('')//my:options/*"/> 
  

Затем, чтобы отобразить ваш оператор select, это просто случай перебора параметров. Хотя xsl:if все еще используется, вам нужно закодировать его только один раз.

   <select id="select1">
     <xsl:for-each select="$options">
        <option value="{.}">
           <xsl:if test=". = $select1">
              <xsl:attribute name="selected">true</xsl:attribute>
           </xsl:if>
           <xsl:value-of select="."/>
        </option>
     </xsl:for-each>
  </select>
  

Вот сокращенный XSLT (содержащий только код для выбора)

 <xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:my="mynamespace"
 exclude-result-prefixes="my">

   <xsl:output method="html" indent="yes" omit-xml-declaration="no" encoding="UTF-8"/>

   <my:options>
      <option>1</option>
      <option>2</option>
      <option>3</option>
      <option>4</option>
   </my:options>
   <xsl:variable name="options" select="document('')//my:options/*"/>

   <xsl:template match="/">
      <HTML>
         <BODY>
            <form>
               <xsl:apply-templates select="root"/>
            </form>
         </BODY>
      </HTML>
   </xsl:template>

   <xsl:template match="root">
      <xsl:variable name="select1" select="radiobuttons/select1"/>
      <select id="select1">
         <xsl:for-each select="$options">
            <option value="{.}">
               <xsl:if test=". = $select1">
                  <xsl:attribute name="selected">true</xsl:attribute>
               </xsl:if>
               <xsl:value-of select="."/>
            </option>
         </xsl:for-each>
      </select>
   </xsl:template>
</xsl:stylesheet>
  

При применении к вашему образцу XML выводится следующее

 <HTML>
<BODY>
<form>
<select id="select1">
<option value="1">1</option>
<option value="2">2</option>
<option value="3" selected="true">3</option>
<option value="4">4</option>
</select>
</form>
</BODY>
</HTML>
  

Комментарии:

1. Что случилось с вашим selected атрибутом в выходных данных?

2. Поскольку выходные данные представляют собой HTML, процессор XLST решил выполнить минимизацию атрибутов, и вместо selected=selected сделал selected =selected . Вместо этого я изменил его на selected=true , чтобы избежать путаницы.

3. Это отлично работает, спасибо. Пришло время создать целую кучу из них!