我希望页面显示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;"/>
答案 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>
请注意:
将当前技能值转换为显示值的所有规则都指定为数据。
决策数据可以在单独的文档中,以便实现完整的参数化。
我们不依赖于意外依赖(例如dispValue = value +1) - 任何关系b / n当前值和显示值都可以表示。
XSLT代码中绝对没有条件逻辑!