如何在另一个模板<xsl:template match =“ sometemplate”>内使用<xsl:apply-templates =“” match =“ othertemplate”>

时间:2019-05-30 07:49:47

标签: xslt

Curent output Expected output我正在尝试使用另一个xsl模板匹配中的xsl模板填充下拉列表。我得到空的下拉菜单。如何从xsl模板获取dropdwon中的值?

我有2个模板。模板1具有首选项列表,模板2具有用户详细信息列表。我正在尝试用用户详细信息列表填充表格。而且我需要将首选项列表填充为表中列的一次作为下拉值。我得到一个空的下拉列表。所附图片供参考

XML输入

<USERLIST>
    <record num="0"><SERIALNUMER>01</SERIALNUMER><NAME>Rahul</NAME> 
  <SELECTEDPREFERENCE>Pref2</SELECTEDPREFERENCE></record>
    <record num="1"><SERIALNUMER>02</SERIALNUMER><NAME>Khan</NAME> 
  <SELECTEDPREFERENCE>Pref4</SELECTEDPREFERENCE></record>
    <record num="2"><SERIALNUMER>03</SERIALNUMER><NAME>Raju</NAME> 
  <SELECTEDPREFERENCE>Pref2</SELECTEDPREFERENCE></record>
    </USERLIST>

    <PREFERENCE_LIST>
    <record num="0"><PREFERENCE_ID>pref1</PREFERENCE_ID></record>
    <record num="1"><PREFERENCE_ID>pref2</PREFERENCE_ID></record>
    <record num="2"><PREFERENCE_ID>pref3</PREFERENCE_ID></record>
    <record num="3"><PREFERENCE_ID>pref4</PREFERENCE_ID></record>
    <record num="4"><PREFERENCE_ID>pref5</PREFERENCE_ID></record>
    </PREFERENCE_LIST>

XSLT

    <?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="html" indent="yes" doctype-public="-//W3C//DTD XHTML 1.0 Transitional//EN" doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" />
    <xsl:template match="/page">
            <div style="margin: 0px; background-color: #ffffff;">          
            <form action="Useraction" method="post" id="user_search" onsubmit="if (document.getElementById('user_search').action.value=='') return false; else return true;" style="margin: 0px; border: 0px; padding-top: 0px;">

                    <hr style="color: #003399; width: 100%; height: 3px; border: 0px; margin-top: 0px; margin-bottom: 5px;" />
                    <table style="width: 100%; text-align: center; border: 0; background-color: #ffffff; margin-bottom: 1px; margin-top: 1px;" cellspacing="0" cellpadding="0">
                        <tr>
                            <td class="tableheader3" style="white-space: nowrap; width: 30px;height:30px">
                                <p align="center">
                                    <input class="tabletext" type="button" value="Alle" onclick="javascript:markAll(document.getElementById('user_search'), 'UserId_')" style="width: 50px;" />
                                </p>
                            </td>
                            <td class="tableheader5" style="width: 30px; text-align: center;">Serial Number</td>
                            <td class="tableheader5" style="white-space: nowrap; width: 60px;">Name</td>
                            <td class="tableheader5" style="white-space: nowrap; width: 40px;">Preference</td>

                        </tr>

                        <tr>
                            <td colspan="12">
                                <hr style="border-top: 1px solid #1A15B7; background: transparent;"> </hr>
                            </td>
                        </tr>
                        <xsl:if test="USERLIST/record">

                        <xsl:apply-templates select="USERLIST/record" />
                        <tr>
                            <td colspan="12">
                                <img src="images/td_background4.jpg" style="width: 100%; height: 5px; border: 0px;" alt="" />
                            </td>
                        </tr>

                        </xsl:if>
                    </table>


            </form>
        </div>  

    </xsl:template>

        <xsl:template match="PREFERENCE_LIST/record">
        <xsl:if test="PREFERENCE_ID=/page/parameters/preference">
            <option value="{PREFERENCE_ID }" selected="selected ">
                <xsl:value-of select="PREFERENCE_ID " />
            </option>
        </xsl:if>
        <xsl:if test="not(PREFERENCE_ID =/page/parameters/preference)">
            <option value="{PREFERENCE_ID }">
                <xsl:value-of select="PREFERENCE_ID " />
            </option>
        </xsl:if>
    </xsl:template>
    <xsl:template match="USERLIST/record">
    <tr>
     <td class="tabletext" style="white-space: nowrap;">
      <xsl:value-of select="SERIALNUMER" />
     </td>
     <td class="tabletext" style="white-space: nowrap;">
      <xsl:value-of select="NAME" />
     </td>
     <td class="tabletext" style="white-space: nowrap;">
      <select class="tabletext" name="preference" style="width:79px;"> 
        <option><xsl:attribute name="value"><xsl:value-of select="SELECTEDPREFERENCE"/> 
        </xsl:attribute></option>
      <option value="" />
          <xsl:apply-templates name="PREFERENCE_LIST/record" />
       </select> 
     </td>
    </tr>
    </xsl:template>
</xsl:stylesheet>

1 个答案:

答案 0 :(得分:0)

如评论中所述,namexsl:apply-templates上不是有效的属性,但是假设您将其更改为select,则未选择任何内容的原因是您当前位于模板与record元素匹配,因此<xsl:apply-templates select="PREFERENCE_LIST/record" />会查找名为record的{​​{1}}的子元素,该子元素不存在。

您需要在层次结构中向上导航两个级别才能获得PREFERENCE_LIST,因此您实际上应该这样写:

PREFERENCE_LIST

我要冒昧地猜测您要在下拉列表中选择用户的<xsl:apply-templates select="../../PREFERENCE_LIST/record" /> 作为选项吗?在这种情况下,您需要将用户选择的首选项传递给SELECTEDPREFERENCE模板。

尝试使用这两个模板

record

请注意,使用<xsl:template match="PREFERENCE_LIST/record"> <xsl:param name="pref" /> <option value="{PREFERENCE_ID}"> <xsl:if test="$pref = PREFERENCE_ID"> <xsl:attribute name="selected">selected</xsl:attribute> </xsl:if> <xsl:value-of select="PREFERENCE_ID " /> </option> </xsl:template> <xsl:template match="USERLIST/record"> <tr> <td class="tabletext" style="white-space: nowrap;"> <xsl:value-of select="SERIALNUMER" /> </td> <td class="tabletext" style="white-space: nowrap;"> <xsl:value-of select="NAME" /> </td> <td class="tabletext" style="white-space: nowrap;"> <select class="tabletext" name="preference" style="width:79px;"> <option value="" /> <xsl:variable name="selectPref" select="translate(SELECTEDPREFERENCE, 'P', 'p')" /> <xsl:apply-templates select="../../PREFERENCE_LIST/record"> <xsl:with-param name="pref" select="$selectPref" /> </xsl:apply-templates> </select> </td> </tr> </xsl:template> 只是因为检查区分大小写,因此translate将不匹配Pref2

http://xsltfiddle.liberty-development.net/ncdD7mS上查看它的运行情况