良好的编码风格,可以在XSLT中进行大小写选择

时间:2011-02-05 04:28:26

标签: javascript asp.net xslt

我希望页面显示A,B,C,D,具体取决于XML值(1,2,3,4)的返回值。我的方法是通过javascript或XSLT:选择。我想知道哪条路更好,为什么?我可以这样做吗?选择.cs代码(好还是坏)?我应该在XSLT中使用javascript代码吗?社区可以提供建议吗?感谢。

以下是代码。

Javascript方式(此方法有效):

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt" xmlns:js="urn:custom-javascript">
  <xsl:template match="page">

    <msxsl:script language="JavaScript" implements-prefix="js">
      <![CDATA[
        function translateSkillLevel(level)
        {
          switch (level)
          {
            case 0: return "Level 1";
            case 1: return "Level 2";
            case 2: return "Level 3";
          }
        return "unknown";
        }
        ]]>
    </msxsl:script>

    <div id="skill">
      <table border="0" cellpadding="1" cellspacing="1">
        <tr>
          <th>Level</th>
        </tr>
        <xsl:for-each select="/page/Skill">
          <tr>
            <td>
              <!-- difference here -->
              <script type="text/javascript">
                document.write(translateSkillLevel(<xsl:value-of select="@level"/>));
              </script>
            </td>
          </tr>

        </xsl:for-each>
      </table>
    </div>
  </xsl:template>
</xsl:stylesheet>


Javascript方式(此方法不起作用,获取未定义的js标记):

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt" xmlns:js="urn:custom-javascript">
  <xsl:template match="page">

    <msxsl:script language="JavaScript" implements-prefix="js">
      <![CDATA[
        function translateSkillLevel(level)
        {
          switch (level)
          {
            case 0: return "Level 1";
            case 1: return "Level 2";
            case 2: return "Level 3";
          }
        return "unknown";
        }
        ]]>
    </msxsl:script>

    <div id="skill">
      <table border="0" cellpadding="1" cellspacing="1">
        <tr>
          <th>Level</th>
        </tr>
        <xsl:for-each select="/page/Skill">
          <tr>
            <td>
               <!-- difference here -->
               <xsl:value-of select="js:translateSkillLevel(string(@level))"/>
            </td>
          </tr>

        </xsl:for-each>
      </table>
    </div>
  </xsl:template>
</xsl:stylesheet>


XSLT方式:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:template match="page">
    <div id="skill">
      <table border="0" cellpadding="1" cellspacing="1">
        <tr>
          <th>Level</th>
        </tr>
        <xsl:for-each select="/page/Skill">
          <tr>
            <td>
              <xsl:choose>
                <xsl:when test="@level = 0">
                  Level 1
                </xsl:when>
                <xsl:when test="@level = 1">
                  Level 2
                </xsl:when>
                <xsl:when test="@level = 2">
                  Level 3
                </xsl:when>
                <xsl:otherwise>
                  unknown
                </xsl:otherwisexsl:otherwise>
              </xsl:choose>
            </td>
          </tr>

        </xsl:for-each>
      </table>
    </div>
  </xsl:template>
</xsl:stylesheet>



编辑: 另外,我有一些用于表单提交的内联javascript函数。

<input type="submit" onclick="javascript:document.forms[0].submit();return false;"/>

3 个答案:

答案 0 :(得分:3)

在这两个中,我肯定会选择XSLT方式。没有必要为此调用整个脚本引擎。

答案 1 :(得分:2)

首先,XSLT的方式是这样的:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="page">
        <div id="skill">
            <table border="0" cellpadding="1" cellspacing="1">
                <tr>
                    <th>Level</th>
                </tr>
                <xsl:apply-templates/>
            </table>
        </div>
    </xsl:template>
    <xsl:template match="Skill">
        <tr>
            <td>
                <xsl:apply-templates select="@level"/>
            </td>
        </tr>
    </xsl:template>
    <xsl:template match="@level">Unknown</xsl:template>
    <xsl:template match="@level[3>.]">
        <xsl:value-of select="concat('Level ',.+1)"/>
    </xsl:template>
</xsl:stylesheet>

输入:

<page>
    <Skill level="1"/>
    <Skill level="4"/>
</page>

输出:

<div id="skill">
    <table border="0" cellpadding="1" cellspacing="1">
        <tr>
            <th>Level</th>
        </tr>
        <tr>
            <td>Level 2</td>
        </tr>
        <tr>
            <td>Unknown</td>
        </tr>
    </table>
</div>

第二:你的第一个样式表不是“按原样”工作,除非你将SCRIPT javascript函数定义为某个HTML translateSkillLevel元素(或者更好,外部LINK

第三:你的第二个样式表可以“工作”,但内联扩展函数实现不是标准的XSLT扩展机制。这就是为什么你使用非标准扩展元素使你的样式表无法在XSLT处理器之间移植。

答案 2 :(得分:1)

不需要扩展功能,XSLT功能强大且足够灵活。

我建议的XSLT实现是(主要是可定制的,灵活的和可扩展的):

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

 <my:skills>
  <s v="0" d="1"/>
  <s v="1" d="2"/>
  <s v="2" d="3"/>
  <other>unknown</other>
 </my:skills>

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

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

 <xsl:template match="page">
    <div id="skill">
        <table border="0" cellpadding="1" cellspacing="1">
            <tr>
                <th>Level</th>
            </tr>
            <xsl:apply-templates select="Skill/@level"/>
        </table>
    </div>
 </xsl:template>

 <xsl:template match="@level">
  <tr>
    <td>
      <xsl:variable name="vSkill" select=
      "$vSkills[@v=current()]/@d"/>
      <xsl:value-of select="$vSkill|$vUnknown[not($vSkill)]"/>
    </td>
  </tr>
 </xsl:template>
</xsl:stylesheet>

将以上转换应用于以下XML文档

<page>
    <Skill level="1"/>
    <Skill level="4"/>
</page>

产生了想要的正确结果

<div id="skill">
    <table border="0" cellpadding="1" cellspacing="1">
        <tr>
            <th>Level</th>
        </tr>
        <tr>
            <td>2</td>
        </tr>
        <tr>
            <td>unknown</td>
        </tr>
    </table>
</div>

请注意

  1. 将当前技能值转换为显示值的所有规则都指定为数据

  2. 决策数据可以在单独的文档中,以便实现完整的参数化。

  3. 我们不依赖于意外依赖(例如dispValue = value +1) - 任何关系b / n当前值和显示值都可以表示。

  4. XSLT代码中绝对没有条件逻辑