1。Xpath认可4种基本的数据类型:节点集,布尔值,数字,字符串。
最普通的表达式类型就是位置路径,它由多个单步执行组成,每个步都包含以下3个基本的部分:轴:定义路径方向;节点测试:选择特定节点集;谓词:提供对节点集的测试条件(可选)。位置步的基本语法是:axis::node-test[predicate]
共有13种定义方向的轴:(默认为child轴)
child按顺序选中上下文节点所有的直接子节点,不包括对属性节点或名称空间节点的选择
employees/child::employee/child::*
descendant选择当前节点的所有后代,允许选择属性节点或名称空间节点
employees/child::employee/child::contact/descendant::*
parent只选择当前节点的直接父节点//*/parent::node()/tilte
ancestor按文档顺序的相反方向选择当前节点的所有祖先节点,始终包括根节点
employees/employee/contact/name/ancestor::*
following-sibling按文档顺序选择文档中此后出现的当前节点的所有兄弟节点
employees/employee/following-sibling::*/contact/name
preceding-silbling按与文档顺序相反的方向选择文档中此前出现的当前节点的所有兄弟节点
employees/employee/preceding-sibling::*
following除当前节点的所有后代节点外,按顺序选择文档中当前节点之后出现的所有节点,不包括属性节点或名称空间节点.employees/employee/following::*
preceding按与文档方向顺序相反的方向选择文档中在当前节点之前出现的所有节点。employees/employee/preceding::*
attribute选择当前节点的所有属性节点employees/employee/attribute::*
namespace选择当前节点的所有名称空间节点,若无则该轴为空
employees/head:header/namespace::*
self选择当前节点employees/employee/contact/email/self::*
descendant-or-self按文档顺序选择当前节点及其所有后代节点,不包括属性节点或名称空间节点employees/child::employee/child::contact/descendant-or-self::*
ancestor-or-self按文档顺序选择当前节点及其所有祖先节点
employees/employee/contact/name/ancestor-or-self::*
节点测试允许从指定轴选择具体的元素或节点类型,方法有:
node-name用于选择它自身的节点名称
*用于选择任意元素节点的通配符
comment()选择注释节点
node()选择任意类型的节点
precessing-instruction()选择处理指令节点
text()选择文本节点
谓词是一种布尔表达式,允许进一步过滤由轴和节点集确定的节点集
缩写:
node-name(等效:child::node-name)
@name(等效:attribute:name)
.(等效:self::node())
..(等效:parent:node())
//(等效:/descendant-or-self:node()/)
2。
在xslt中使用javascript:(注意的是脚本中若有――字符,则应该把该代码从XSLT中取出,放入一个独立的脚本文件中)
<?xml version=”1.0”?>
<xsl:stylesheet version=”1.0” xmlns:xsl=http://www.w3.org/1999/xsl/transform >
<xsl:output method=”html” indent=”yes” encoding=”UTF-8” />
<xsl:template match=”/”>
<html>
<head>
<script language=”javaScript”>
<xsl:comment>
var varName=’pull’;
var NS4=(document.layers)?1:0;
var IE=(document.all)?1:0;
var DOM=(parseInt(navigator.appVersion)>=5)?1:0;
var MAC=((navigator.appVersion.indexOf(“PPC”)>0)||
(navigator.appVersion.indexOf(“Mac”)>0))?1:0
function showLayer(){return;}
function HideLayer(){return;}
if(document.layers){
appVer=navigator.appVersion.substring(0,4);
if(appVer<4.06)NS4=0;
}
if(NS4||IE||DOM)pullDown=1;
if(!pullDown)event=null;
//</xsl:comment>
</script>
<title>creating a javascript</title>
</head>
<body>
some text here!
</body>
</html>
</xsl:template>
</xsl:stylesheet>
或者可以这样:
<script language=”javascript”>
<xsl:attribute name=”src”>myscript.js</xsl:attribute>
<xsl:comment>comment for browsers having trouble with script element</xsl:comment>
</script>
3。
xsl中的一些指令
xsl:apply-imports引入模板
xsl:apply-templates识别待处理的节点集,调用相应的模板规则
xsl:attribute创建属性
xsl:call-template调用一个指定的模板
xsl:choose必有一个xsl:when用于选择
xsl:comment 创建注释
xsl:copy浅复制
xsl:copy-of深复制
xsl:element创建元素
xsl:fallback用来确保正向兼容
xsl:for-each利用XPath表达式选择节点集
xsl:if满足条件时实例化该模板实体
xsl:message输出一个消息
xsl:mumber插入一个格式化整数
xsl:processing-instruction创建一个处理指令
xsl:text计算xslt结果树中的文本节点
xsl:value-of将单个源节点的字符串复制给输出树
xsl:variable可用做最高级元素或模板中的指令
'''''''''''''''''''''''''''''''''''''''
例子:
xsl生成超链接:
<a><xsl:attribute name="href">Name.asp</xsl:attribute><xsl:value-of select="name" /></a>
指令:
<xsl:processing-instruction name=”xml-stylesheet”>href=”employees.css”
type=”text/css”</xsl:processing-instruction>
结果:<?xml-stylesheet href=”employees.css” type=”text/css” ?>
创建文字正文:
<xsl:text>some content would be nice</xsl:text>
应用xsl:for-each:
<xsl:for-each select=”*”>
<xsl:choose>
<xsl:when test=”name(parent::*)=’name’”>
<xsl:value-of select=”.” />
<xsl:text> </xsl:text>
</xsl:when>
<xsl:otherwise>
<xsl:choose>
<xsl:when test=”name()=’street’”>
<xsl:value-of select=”.” />
<br />
</xsl:when>
<xsl:when test=”name()=’city’”>
<xsl:value-of select=”.” />
<xsl:text>,</xsl:text>
<xsl:when>
<xsl:otherwise>
<xsl:value-of select=”.” />
<xsl:text>,</xsl:text>
</xsl:otherwise>
</xsl:choose>
</xsl:otherwise>
</xsl:choose>
<xsl:for-each>
使用mode属性促成多路处理:
<xsl:template match=”/”>
<xsl:apply-templates select=”employees/employee” mode=”programming” />
</xsl:template>
<xsl:template match=”employee” mode=”programming”>
<xsl:if test=”@dept=’programming’”>
<xsl:value-of select=”contact/name” />
</xsl:if>
</xsl:template>
<xsl:template match=”employee” mode=”training”>
<xsl:if test=”@dept=’training’”>
<xsl:value-of select=”contact/name” />
</xsl:if>
</xsl:template>
在xslt中使用javascript:(注意的是脚本中若有――字符,则应该把该代码从XSLT中取出,放入一个独立的脚本文件中)
<?xml version=”1.0”?>
<xsl:stylesheet version=”1.0” xmlns:xsl=http://www.w3.org/1999/xsl/transform >
<xsl:output method=”html” indent=”yes” encoding=”UTF-8” />
<xsl:template match=”/”>
<html>
<head>
<script language=”javaScript”>
<xsl:comment>
var varName=’pull’;
var NS4=(document.layers)?1:0;
var IE=(document.all)?1:0;
var DOM=(parseInt(navigator.appVersion)>=5)?1:0;
var MAC=((navigator.appVersion.indexOf(“PPC”)>0)||
(navigator.appVersion.indexOf(“Mac”)>0))?1:0
function showLayer(){return;}
function HideLayer(){return;}
if(document.layers){
appVer=navigator.appVersion.substring(0,4);
if(appVer<4.06)NS4=0;
}
if(NS4||IE||DOM)pullDown=1;
if(!pullDown)event=null;
//</xsl:comment>
</script>
<title>creating a javascript</title>
</head>
<body>
some text here!
</body>
</html>
</xsl:template>
</xsl:stylesheet>
或者可以这样:
<script language=”javascript”>
<xsl:attribute name=”src”>myscript.js</xsl:attribute>
<xsl:comment>comment for browsers having trouble with script element</xsl:comment>
</script>
3。
xsl中的一些指令
xsl:apply-imports引入模板
xsl:apply-templates识别待处理的节点集,调用相应的模板规则
xsl:attribute创建属性
xsl:call-template调用一个指定的模板
xsl:choose必有一个xsl:when用于选择
xsl:comment 创建注释
xsl:copy浅复制
xsl:copy-of深复制
xsl:element创建元素
xsl:fallback用来确保正向兼容
xsl:for-each利用XPath表达式选择节点集
xsl:if满足条件时实例化该模板实体
xsl:message输出一个消息
xsl:mumber插入一个格式化整数
xsl:processing-instruction创建一个处理指令
xsl:text计算xslt结果树中的文本节点
xsl:value-of将单个源节点的字符串复制给输出树
xsl:variable可用做最高级元素或模板中的指令
'''''''''''''''''''''''''''''''''''''''
例子:
xsl生成超链接:
<a><xsl:attribute name="href">Name.asp</xsl:attribute><xsl:value-of select="name" /></a>
指令:
<xsl:processing-instruction name=”xml-stylesheet”>href=”employees.css”
type=”text/css”</xsl:processing-instruction>
结果:<?xml-stylesheet href=”employees.css” type=”text/css” ?>
创建文字正文:
<xsl:text>some content would be nice</xsl:text>
应用xsl:for-each:
<xsl:for-each select=”*”>
<xsl:choose>
<xsl:when test=”name(parent::*)=’name’”>
<xsl:value-of select=”.” />
<xsl:text> </xsl:text>
</xsl:when>
<xsl:otherwise>
<xsl:choose>
<xsl:when test=”name()=’street’”>
<xsl:value-of select=”.” />
<br />
</xsl:when>
<xsl:when test=”name()=’city’”>
<xsl:value-of select=”.” />
<xsl:text>,</xsl:text>
<xsl:when>
<xsl:otherwise>
<xsl:value-of select=”.” />
<xsl:text>,</xsl:text>
</xsl:otherwise>
</xsl:choose>
</xsl:otherwise>
</xsl:choose>
<xsl:for-each>
使用mode属性促成多路处理:
<xsl:template match=”/”>
<xsl:apply-templates select=”employees/employee” mode=”programming” />
</xsl:template>
<xsl:template match=”employee” mode=”programming”>
<xsl:if test=”@dept=’programming’”>
<xsl:value-of select=”contact/name” />
</xsl:if>
</xsl:template>
<xsl:template match=”employee” mode=”training”>
<xsl:if test=”@dept=’training’”>
<xsl:value-of select=”contact/name” />
</xsl:if>
</xsl:template>