我有以下XML:
<DropDownList id="Dropdown">
<Label text="Dropdown"/>
<ListItem value="Test1"/>
<ListItem value="Test2"/>
</DropDownList>
<ListBox id="Listbox1" >
<Label text="SingleSelect"/>
<ListItem value="Test1"/>
<ListItem value="Test2"/>
</ListBox>
然后我为列表框提供了以下XSLT:
<xsl:template match="ListBox">
<th>
<xsl:apply-templates select="./Label" />
</th>
<td>
<asp:ListBox runat="server" ID="{@id}">
<Items>
<xsl:for-each select="./ListItem">
<asp:ListItem Value="{@value}">
<xsl:attribute name="Text">
<!-- fill text accordingly to text attribute or same as value when not specified-->
<xsl:choose>
<xsl:when test="@text">
<xsl:value-of select="@text"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="@value"/>
</xsl:otherwise>
</xsl:choose>
</xsl:attribute>
<xsl:if test="@selected">
<xsl:attribute name="selected">
<xsl:value-of select="@selected"/>
</xsl:attribute>
</xsl:if>
</asp:ListItem>
</xsl:for-each>
</Items>
</asp:ListBox>
</td>
<td>
<xsl:apply-templates select="./*[contains(name(), 'Validation')]" />
</td>
<xsl:copy-of select="$br"/>
</xsl:template>
使用这种方法,我也必须复制DropDownList
元素的整个循环。
现在,为了避免重复,我理解我可以做这样的事情:
<xsl:template match="ListBox">
<th>
<xsl:apply-templates select="./Label" />
</th>
<td>
<asp:ListBox runat="server" ID="{@id}">
<Items>
<xsl:apply-templates select="./ListItem" />
</Items>
</asp:ListBox>
</td>
<td>
<xsl:apply-templates select="./*[contains(name(), 'Validation')]" />
</td>
<xsl:copy-of select="$br"/>
</xsl:template>
<!-- Helper template for list items -->
<xsl:template match="ListItem">
<asp:ListItem Value="{@value}">
<xsl:attribute name="Text">
<!-- fill text accordingly to text attribute or same as value when not specified-->
<xsl:choose>
<xsl:when test="@text">
<xsl:value-of select="@text"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="@value"/>
</xsl:otherwise>
</xsl:choose>
</xsl:attribute>
<xsl:if test="@selected">
<xsl:attribute name="selected">
<xsl:value-of select="@selected"/>
</xsl:attribute>
</xsl:if>
</asp:ListItem>
</xsl:template>
但我不喜欢这个是
<Items>
<xsl:apply-templates select="./ListItem" />
</Items>
模式我不得不复制。有没有办法将<Items> {loop through ListItems}</Items>
部分完全放入模板中,并使用<xsl:apply-templates select="??" />
将所有ListItem子节点组合在一起并将它们填充到循环模板中?
答案 0 :(得分:1)
为什么不使用命名模板?
<td>
<asp:ListBox runat="server" ID="{@id}">
<xsl:call-template name="LoopItems"/>
</asp:ListBox>
</td>
使用命名模板:
<xsl:template name="LoopItems">
<Items>
<xsl:apply-templates select="ListItem" />
</Items>
</xsl:template>
答案 1 :(得分:0)
这个模板怎么样:
<xsl:template match="ListBox|DropDownList">
<th>
<xsl:apply-templates select="Label" />
</th>
<td>
<xsl:element name="asp:{name()}">
<Items>
<xsl:apply-templates select="ListItem" />
</Items>
</xsl:element>
</td>
<td>
<xsl:apply-templates select="*[contains(name(), 'Validation')]" />
</td>
</xsl:template>