使用 XSLT 在选择字段中显示来自 XML 的数据

Posted

技术标签:

【中文标题】使用 XSLT 在选择字段中显示来自 XML 的数据【英文标题】:Displaying data from XML in a select field using an XSLT 【发布时间】:2011-12-15 03:30:04 【问题描述】:

我确信这是另一个 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>

下面是我在这个 XML 中使用的 XSLT。我已经设置了复选框和单选按钮,以使用 xsl:if 命令根据 XML 中的数据检查自身。测试隐藏 div 还使用相同的 xsl:if 显示依赖于 XML 数据。输入字段只显示它所针对的 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 方法使其工作。

从上面的示例代码中,我希望选择字段显示 XML 中所述的第三个选项。任何人都可以建议,或者更好地给我一个例子,我可以如何将一个选择字段编码到我的 XSLT 中,它会以上述方式运行?任何帮助都将非常感激!

【问题讨论】:

【参考方案1】:

您可以做的是将您的 select 语句的所有四个选项放在 XSLT 中,以充当一种查找表(必须在顶部定义 my 命名空间你的 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>

【讨论】:

输出中的selected 属性发生了什么变化? 因为输出是 HTML,XLST 处理器决定进行属性最小化,因此 selected 而不是 selected=selected。为了避免混淆,我已将其更改为 selected=true 效果很好,谢谢。是时候生产一大堆了!

以上是关于使用 XSLT 在选择字段中显示来自 XML 的数据的主要内容,如果未能解决你的问题,请参考以下文章