根据条件应用XSLT模板

时间:2014-03-06 04:09:49

标签: xml xslt

我想在xslt上使用以下模板:

<xsl:template match="data/test/row> <!-- This 'match' is from database -->
   <label class="checkbox-inline"> 
       <input type="checkbox" id="someid" name="somename" value="{CATEGORY_ID}" /><xsl:value-of select="CATEGORY_NAME}"  />
    </label>
</xsl:template>

  <xsl:template match="data/test/row> <!-- This 'match' is from database same as above -->
   <label class="checkbox-inline"> 
       <input type="checkbox" id="someid" name="somename" value="{CATEGORY_ID}" disabled="true" /><xsl:value-of select="CATEGORY_NAME}" />
    </label>
</xsl:template>  

我根据xslt中的角色格式化了上面的2。

如何在我的xslt中以这样的方式制定模板,即基于说,角色? 例如,

<xsl:choose>
    <xsl:when test="ROLE_NAME = 'Normal User'>
       <!-- use disabled input-->
    </xsl:when>
    <xsl:otherwise>
        <!-- use enabled input-->
    </xsl:otherwise>
 </xsl:choose> 
<!-- Role comes form another place... Here is a sample: -->
<ROOT>
   <ROLE_NAME>Admin</ROLE_NAME>
   <ROLE_NAME>Normal User</ROLE_NAME>
</ROOT>

1 个答案:

答案 0 :(得分:1)

您必须在某处获取角色信息。如果它是源XML中的某些数据,则可以通过XPath提取它。由于它是运行时信息(当前用户的角色),因此可以通过参数获取。我会假设您以某种方式拥有该角色,并将其归因于参数或变量。

要测试它,您的属性是$role-name变量的初始值,添加select="普通用户'“。

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">

    <xsl:param name="role-name"/>
...

</xsl:stylesheet>

在某个匹配父节点的模板中,您可以测试参数,并使用mode中的<xsl:template>属性决定要调用的模板:

<xsl:template match="/">
    <xsl:choose>
        <xsl:when test="$role-name = 'Normal User'">
            <xsl:apply-templates mode="disabled"/>
        </xsl:when>
        <xsl:otherwise>
            <xsl:apply-templates mode="enabled"/>
        </xsl:otherwise>
    </xsl:choose> 
</xsl:template>

enableddisabled是我为模式选择的任意名称。您现在必须相应地标记模板。现在,它们不仅会匹配XPath表达式,还会匹配mode名称:

<xsl:template match="data/test/row" mode="enabled"> <!-- This 'match' is from database -->
    <label class="checkbox-inline"> 
        <input type="checkbox" id="someid" name="somename" value="{CATEGORY_ID}" />
        <xsl:value-of select="CATEGORY_NAME"  />
    </label>
</xsl:template>

<xsl:template match="data/test/row" mode="disabled"> <!-- This 'match' is from database same as above -->
    <label class="checkbox-inline"> 
        <input type="checkbox" id="someid" name="somename" value="{CATEGORY_ID}" disabled="true" />
        <xsl:value-of select="CATEGORY_NAME" />
    </label>
</xsl:template> 

如果您当前的角色信息位于外部文档中,您还可以使用document()函数将其分配给参数或变量(路径和文件名是任意选择的):

<xsl:param name="role-name" select="document('runtime-info.xml')/user/role"/>

如果它位于源文档中的某个位置,您只需找到它并发现如何通过XPath获取该数据。