惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

酷 壳 – CoolShell
酷 壳 – CoolShell
H
Hacker News: Front Page
P
Palo Alto Networks Blog
T
ThreatConnect
Apple Machine Learning Research
Apple Machine Learning Research
博客园_首页
T
True Tiger Recordings
P
Privacy & Cybersecurity Law Blog
B
Blog
IT之家
IT之家
Last Week in AI
Last Week in AI
F
Full Disclosure
Hacker News: Ask HN
Hacker News: Ask HN
C
Comments on: Blog
Microsoft Azure Blog
Microsoft Azure Blog
C
Cybersecurity and Infrastructure Security Agency CISA
Microsoft Security Blog
Microsoft Security Blog
博客园 - 【当耐特】
N
News and Events Feed by Topic
NISL@THU
NISL@THU
腾讯CDC
雷峰网
雷峰网
Security Latest
Security Latest
李成银的技术随笔
M
Microsoft Research Blog - Microsoft Research
L
LangChain Blog
L
Lohrmann on Cybersecurity
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
C
Check Point Blog
Y
Y Combinator Blog
Recent Announcements
Recent Announcements
博客园 - Franky
N
News | PayPal Newsroom
V
V2EX
A
About on SuperTechFans
The Register - Security
The Register - Security
月光博客
月光博客
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Google Online Security Blog
Google Online Security Blog
MyScale Blog
MyScale Blog
Cisco Talos Blog
Cisco Talos Blog
Vercel News
Vercel News
WordPress大学
WordPress大学
C
Cyber Attacks, Cyber Crime and Cyber Security
The Hacker News
The Hacker News
IntelliJ IDEA : IntelliJ IDEA – the Leading IDE for Professional Development in Java and Kotlin | The JetBrains Blog
IntelliJ IDEA : IntelliJ IDEA – the Leading IDE for Professional Development in Java and Kotlin | The JetBrains Blog
爱范儿
爱范儿
A
Arctic Wolf
L
LINUX DO - 最新话题
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More

博客园 - Snowwolf

新建用户无法通过SecureSRT进行ssh登录到远程linux (zz) 【转】产品描述英文专用术语 互联网/移动互联网小团队创业 第一集 汪华(zz) ff下链接没有.click的处理 - Snowwolf - 博客园 自定义模型中“文件”字段的运用 几点Session使用的经验(转载) 极品家丁经典语录 SQL开发中容易忽视的一些小地方(zz) 如何激发团队激情(zz) Paul Graham:写给创业者的13句话 你是怎样给下属分配工作 如何让客户找你?(zz) 放下!才能走的更远!!(zz) 赢利能力的魔鬼(zz) 创业心得(zz) 滋阴保肾8大宝贝 十省有线网络公司结盟区域网:打造国干网 速算 js四舍五入
XSLT教程
Snowwolf · 2010-07-16 · via 博客园 - Snowwolf

XML文档树

1) XML可以转化文档树

2) XSLTXML的转化过程

内建模板规则

调用<xsl:apply-templates>处理根节点的儿子。处理时,使用调用时相同的模式

元素

调用<xsl:apply-templates>处理该节点的儿子。处理时,使用调用时相同的模式

属性

拷贝属性值到结果树,结果作为文本而不是属性节点

文本

拷贝文本到结果树

注释

不做任何事

处理指令

不做任何事

命名空间

不做任何事

XSLT 1.0支持的五种数据类型

numberbooleanstringnode-settree

相互之间的转化

     

boolean

number

string

node-set

tree

boolean

/

false -> 0

true -> 1

false -> ‘false’

true -> ‘true’

不允许

不允许

number

0 -> false

0-> true

/

转化为十进制数

不允许

不允许

string

null-> false

其他 -> true

解析为十进制

/

不允许

不允许

node-set

empty -> false

其他 -> true

通过string转化

文档顺序中第一个节点的字符串值

/

不允许

tree

通过string转化

通过string转化

连接所有的文本节点

不允许

/

说明:

Tree很少见,只有在xsl:variable中才出现。xslt2.0已经取消该类型。另外,转化为node-set,标准xslt1.0不提供,但是扩展接口通常都是提供的。比如微软提供了msxsl:node-set

XPath

基本概念

绝对路径的写法

上下文节点(context node

XPath中直接包含的,和当前节点等同。上下文节点可以通过“.”得到。

position()可以得到上下文节点的当前值。

last()可以得到上下文节点的大小

可以修改上下文节点的xslt标签

xsl:apply-templates xsl:for-each

xsl:for-each一个常用的特色就是修改context node

Axes

参见P282

Axes

Description

ancestor::

The ancestors of the context node.

The ancestors of the context node consist of the parent of the context node and the parent's parent and so on; thus the ancestor:: axis always includes the root node unless the context node is the root node.

ancestor-or-self::

The context node and its ancestors.

The ancestor-or-self:: axis always includes the root node.

attribute::

The attributes of the context node.

This axis will be empty unless the context node is an element.

child::

The children of the context node.

A child is any node immediately below the context node in the tree. However, neither attribute or namespace nodes are considered children of the context node.

descendant::

The descendants of the context node.

A descendant is a child or a child of a child and so on; thus the descendant:: axis never contains attribute or namespace nodes.

descendant-or-self::

The context node and its descendants.

following::

All nodes that are after the context node in the tree, excluding any descendants, attribute nodes, and namespace nodes.

following-sibling::

All the following siblings of the context node.

The following-sibling:: axis identifies just those children of a parent node who appear in the tree after the context node. This axis excludes all other children that appear before the context node.

If the context node is an attribute node or namespace node, the following-sibling:: axis is empty.

namespace::

The namespace nodes of the context node.

There is a namespace node for every namespace which is in scope for the context node.

This axis will be empty unless the context node is an element.

parent::

The parent of the context node, if there is one.

The parent is the node immediately above the context node in the tree.

preceding::

All nodes that are before the context node in the tree, excluding any ancestors, attribute nodes, and namespace nodes.

One way to think of the preceding axis is all nodes whose content occurs in their entirety before the start of the context node.

preceding-sibling::

All the preceding siblings of the context node.

The preceding-sibling:: axis identifies just those children of a parent node who appear in the tree before the context node. This axis excludes all other children that appear after the context node.

If the context node is an attribute node or namespace node, the preceding-sibling:: axis is empty.

self::

Just the context node itself.

几种简写方式

self::

.

attribute::

@

parent::

..

child::

/descendant-or-self::node()

//

Filter

[] 里面的值是boolean类型,如果不是(数值除外)就会发生强制类型转化成boolean

数值的特性

其他

NameTest *

Union |

XPath部分函数

Node-Set函数

count()local-name()name()position()last()

String函数

concat()contains()starts-with()string()string-length()substring ()substring-after()substring-before()translate()

    <xsl:variable name="UpCaseHttp" select="translate($ItemValue, 'htp', 'HTP')"/>

Boolean函数

boolean()false()not()true()

Number函数

ceiling()floor()number()round()sum()

XSLT标签

xsl:template xsl:call-template xsl:apply-templates xsl:param xsl:with-param

 <xsl:template name="JSButton">

    <xsl:param name="Name"/>

    <xsl:param name="JS"/>

    <img src="../images/empty.gif" width="5" height="1"/>

    <span class="clsButtonFace">

      <a onclick="javascript:{$JS};">

        <xsl:value-of select="$Name"/>

      </a>

    </span>

 </xsl:template>

 <xsl:template name="ea:SaveNoNewButton">

    <xsl:call-template name="JSButton">

      <xsl:with-param name="Name" select="' 保存'"/>

      <xsl:with-param name="JS" select="'verify(&quot;Save&quot;)'"/>

    </xsl:call-template>

 </xsl:template>

 <xsl:apply-templates select="Ebanswers/PAGE">

 <xsl:template match="PAGE">

 </xsl:template>

xsl:foreach

          <xsl:for-each select="$CodeTable">

            <option value="{CODE_VALUE}">

              <xsl:if test="CODE_VALUE = $AValue">

                <xsl:attribute name="selected"/>

              </xsl:if>

              <xsl:value-of select="CODE_NAME"/>

            </option>

          </xsl:for-each>

xsl:sort

<xsl:sort

 select = string-Expression

 lang = { nmtoken }

 data-type = { "text" | "number" | QName }

 order = { "ascending" | "descending" }

 case-order = { "upper-first" | "lower-first" }

 />

紧随xsl:apply-templatesxsl:for-each

    <xsl:apply-templates select="/Toolkit/tk:Table/tk:Field[tk:List]">

      <xsl:sort select="tk:List/@Order" data-type="number"/>

    </xsl:apply-templates>

xsl:variable

注意字符串变量

 <xsl:variable name="Test" select="'title'"/>

xsl:value-of xsl:text

<xsl:value-of

 select = Expression

 disable-output-escaping = "yes" | "no"

</xsl:value-of>

<xsl:text

 disable-output-escaping = "yes" | "no">

</xsl:text>

 <xsl:template name="ea:WhiteSpace">

    <xsl:text disable-output-escaping="yes">&amp;nbsp;</xsl:text>

 </xsl:template>

xsl:element xsl:attribute xsl:attribute-set

XML File (item.xml)

<?xml version="1.0"?>

<?xml-stylesheet type="text/xsl" href="element.xsl" ?>

<root>

   <item>My Item</item>

</root>

XSLT File (element.xsl)

<?xml version="1.0"?>

<xsl:stylesheet version="1.0"

      xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >

<xsl:template match="item">

   <xsl:element name="xsl:template">

      <xsl:attribute name="match">cost</xsl:attribute>

      <xsl:attribute name="xml:space">preserve</xsl:attribute>

      <xsl:apply-templates/>

   </xsl:element>

</xsl:template>

</xsl:stylesheet>

Output

This is the formatted output:

My Item

The following is the processor output, with line breaks added for clarity.

<?xml version="1.0"?>

<xsl:template match="cost"

      xml:space="preserve"

      xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

My Item</xsl:template>

 <xsl:attribute-set name="ea:WrapAttrs">

    <xsl:attribute name="nowrap"/>

 </xsl:attribute-set>

 <!--不能为空的字段的显示名称的td的attribute-set-->

 <xsl:attribute-set name="ea:NonEmptyAttrs" use-attribute-sets="ea:WrapAttrs">

    <xsl:attribute name="align">right</xsl:attribute>

    <xsl:attribute name="bgcolor">#E2EBF6</xsl:attribute>

 </xsl:attribute-set>

xsl:if xsl:choose xsl:when xsl:otherwise

        <a href="{$HttpRef}">

          <xsl:if test="$Target != ''">

            <xsl:attribute name="target"><xsl:value-of select="$Target"/></xsl:attribute>

          </xsl:if>

          <xsl:value-of select="$ItemValue"/>

        </a>

      <xsl:choose>

        <xsl:when test="$BigHrefType='HREF'">

          <a href="{$HrefAddress}">

            <xsl:value-of select="$Value"/>

          </a>

        </xsl:when>

        <xsl:when test="$BigHrefType='EMAIL'">

          <a href="mailto:{$Value}">

            <xsl:value-of select="$Value"/>

          </a>

        </xsl:when>

        <xsl:otherwise>

          <xsl:call-template name="ea:ProcessText">

            <xsl:with-param name="Text" select="$Value"/>

          </xsl:call-template>

        </xsl:otherwise>

      </xsl:choose>

xsl:import xsl:include

 <xsl:import href="PublicUtil.xslt"/>

xsl:copy-of xsl:output

 <xsl:output method="html" indent="no"/>

 <xsl:variable name="ea:NoRecord">

    <tr>

      <td colspan="20" class="pad5">没有内容</td>

    </tr>

 </xsl:variable>

 <xsl:copy-of select="$ea:NoRecord"/>

XSLT函数

current()

通常情况下,和“.”返回的值相同。只有在filter情况下,才不同。

<xsl:apply-templates select="//glossary/item[@name=current()/@ref]"/

document()

 <xsl:variable name="ea:FieldList" select="document('')/xsl:stylesheet/ea:FieldList"/>

format-number()

format-number(53.51, "#.0000") // "53.5100"

其他

递归:

 <xsl:template name="ea:ProcessText">

    <xsl:param name="Text"/>

    <xsl:choose>

      <xsl:when test="contains($Text,'&#10;')">

        <xsl:value-of select="substring-before($Text,'&#10;')"/>

        <br/>

        <xsl:call-template name="ea:ProcessText">

          <xsl:with-param name="Text" select="substring-after($Text,'&#10;')"/>

        </xsl:call-template>

      </xsl:when>

      <xsl:otherwise>

        <p style="word-break:break-all">

          <xsl:value-of select="$Text"/>

        </p>

      </xsl:otherwise>

    </xsl:choose>

 </xsl:template>

 <xsl:template name="ShowRow">

    <xsl:param name="CurIndex" select="0"/>

    <xsl:param name="Data"/>

    <xsl:param name="CurRow"/>

    <xsl:if test="$CurIndex=0">

      <td bgcolor="#6D8CAB">

        <a href="{concat($WeekLink, 'Date=', $Data/Date)}">

          <img src="{concat('../images/link_', $CurRow + 1, '.gif')}" width="18" height="40" border="0" alt="周历"/>

        </a>

      </td>

    </xsl:if>

    <xsl:if test="$CurIndex &lt; 7">

      <xsl:call-template name="ShowData">

        <xsl:with-param name="Data" select="$Data"/>

      </xsl:call-template>

      <xsl:for-each select="$Data">

        <xsl:call-template name="ShowRow">

          <xsl:with-param name="CurIndex" select="$CurIndex + 1"/>

          <xsl:with-param name="Data" select="following-sibling::DateDescription[1]"/>

        </xsl:call-template>

      </xsl:for-each>

    </xsl:if>

 </xsl:template>

优先级问题

<xsl:import>存在优先级问题

模糊匹配的,例如*,优先级比较低

属性值模板

        <a href="{concat($WeekLink, 'Date=', $Data/Date)}">