问题提出:
有一个XML,下面有n个结点(n>=1),用XSL将这n个结点转换到HTML的Table标记中,这个Table有两列,左边的列放入第1、3、5……个结点,右边的列放第2、4、6……个结点。
分析:
Table是Rows(<tr>)的集合,row是Cells(<td>)的集合,根据这个特点,企图直接按结点索引的奇偶将结点找到,然后生成列的方法是不可行的。
应该按Rows来生成Table。
n可能为奇数,也可能为偶数,因为n>=1 ,故Rows的总数等于n中的奇数个数。
程序流程为,一个for-each循环,判断是否为奇数结点,判断结果为真,则新建一个row;在新建row之后,创建两个cell,第一列放入奇数结点,第二列放入该奇数结点的下一个结点。主要用到xsl:for-each和xsl:variable两个XSLT元素。
XML代码:
<?xml version="1.0" encoding="gb2312"?>
<?xml-stylesheet type='text/xsl' href='3.xsl'?>
<subject>
<class>
<classid>1</classid>
<text>数据一</text>
</class>
<class>
<classid>2</classid>
<text>数据二</text>
</class>
<class>
<classid>3</classid>
<text>数据三</text>
</class>
<class>
<classid>4</classid>
<text>数据四</text>
</class>
<class>
<classid>5</classid>
<text>数据五</text>
</class>
</subject>
XSL代码:
<?xml version='1.0' encoding='gb2312'?>
<xsl:stylesheet version="1.0"
xmlns="http://www.w3.org/TR/REC-html40"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<table border ="1">
<xsl:for-each select="//class">
<xsl:if test="(position() mod 2 = 1)">
<xsl:variable name="n" select="position()"/>
<tr><td><xsl:value-of select="."/></td>
<td><xsl:value-of select="//class[$n+1]" /></td></tr>
</xsl:if>
</xsl:for-each>
</table>
</xsl:template>
</xsl:stylesheet>
运行结果是:
1 数据一 2 数据二
3 数据三 4 数据四
5 数据五
优化上面的XSL
上面的方法检索N个结点,效率不是很高。直接用Xpath查询查到奇数结点,检索次数会减少一半。于是有了下面这个XSL:
<?xml version='1.0' encoding='gb2312'?>
<xsl:stylesheet version="1.0"
xmlns="http://www.w3.org/TR/REC-html40"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<table border ="1">
<xsl:apply-templates select="//class[position() mod 2 = 1]" />
</table>
</xsl:template>
<xsl:template match="//class[position() mod 2 = 1]">
<xsl:variable name="n" select="position()"/>
<tr><td><xsl:value-of select="."/></td>
<td><xsl:value-of select="//class[$n+1]" /></td></tr>
</xsl:template>
</xsl:stylesheet>
运行结果是:
1 数据一 2 数据二
3 数据三 3 数据三
5 数据五 4 数据四
这是为什么呢?position函数将返回该结点的索引,难道不对吗?注意,索引的建立取决于该结点的父母是谁,在上文提到的两个XSL中,结点的父母分别是//class与//class[position() mod 2 = 1],所以第二个XSL没有生成预期结果。
在第二个XSL中,该结点的possition与该结点在父母结点的索引的换算公式如下:n=2 * position() -1,那么该结点的下一个兄弟结点就是2 * position() 。我们把 <xsl:value-of select="//class[$n+1]" />修改成<xsl:value-of select="//class[$n * 2]" />,这样输出结果就正确了。
运行结果是:
1 数据一 2 数据二
3 数据三 4 数据四
5 数据五
分享到:
相关推荐
设计算法判断单循环链表是否每个结点的值都是偶数,建立链表,判断,显示。 对任意输入的一组数据,建立一个递增有序的单链表。 将单链表L中的奇数项和偶数项结点分解开,并分别连成一个单链表。 用递增有序的链表A...
设计一个算法,将一个结点值自然数的单链表拆分为两个单链表,原表中保留值为偶数的结点,而值为奇数的结点按它们在原表中的相对次序组成一个新的单链表。
聚集索引是指数据记录按照索引的顺序来存储的,叶子结点即存储了真实的数据行,不再需要另外单独的数据页。非聚集索引是指数据记录存储顺序与索引顺序无关,叶结点包含索引字段值及指向数据页数据行的逻辑指针。 ...
要求控制台显示如下内容,然后根据前方数字进行相应操作 1、创建一条含整数结点的无序链表 2、链表结点的输出 3、链表结点的升序排序 4、分别计算链表中奇数和偶数结点之和并输出 5、释放链表 0、退出
总的来说,单循环链表是数据结构中的基础工具,理解和掌握其原理和实现方式对于学习更复杂的算法和数据结构至关重要。无论是带头结点还是不带头结点,都有其适用的场景和优缺点,开发者应根据具体需求选择合适的数据...
* 查询效率低:链表的查询效率较低,需要遍历整个链表来查找一个结点。 结论 ---- 链表是一种基本的数据结构,它广泛应用于各个领域。今天,我们学习了如何建立一个带有头结点的链表,并了解了链表的实现和应用。
SQL Server 索引基础知识----聚集索引,非聚集索引 SQL Server 索引是关系型数据库中的一种重要组件,它可以大大提高查询的效率。索引可以分为聚集索引和非聚集索引两种,本文将详细介绍这两种索引的概念、特点和...
总的来说,“带有头结点的链表”是理解和操作链表数据结构的基础。通过创建、翻转和销毁链表,我们可以更深入地理解链表的工作原理,这对于学习更复杂的数据结构和算法至关重要。实际编码和测试这些操作可以帮助我们...
二叉树的指定结点路径 二叉树是一种常见的数据结构,它有广泛的应用,如文件系统、数据库、浏览器的历史记录等。在二叉树中,每个结点最多有两个孩子结点,即左孩子和右孩子。二叉树可以分为满二叉树、完全二叉树和...
判别结点u是否为结点v的子孙
在函数内部,它首先遍历链表直到找到目标结点的前一个结点`p`,这一步通过计数器`k`和用户输入的索引`i`来控制。一旦找到目标结点,函数将`p`的`next`指针指向目标结点的下一个结点,从而跳过目标结点,完成删除操作...
该函数使用栈来存储结点,並在遍历过程中检查是否存在目标结点。 四、 查找结点的路径 void OutOrder(BiTree T, char x) 函数用于查找结点的路径。该函数将从根结点出发,按照中序遍历的顺序访问二叉树中的所有...
采用先序法建立一棵二叉树,设计输出某结点数据为x的双亲结点的数据的程序,二叉树的数据域类型为字符型, 扩展二叉树的叶子结点用‘#’表示,要求可以求一棵二叉树中多个结点的双亲。
本程序以C/C++语言实现,利用带头结点的单向循环链表来解决这个问题。这里我们将深入探讨相关知识点。 首先,**带头结点的单向循环链表**是链表的一种特殊形式。与普通的单向链表不同,它在第一个元素(头结点)...
该程序使用C++语言编写,使用了结构体BiNode来定义二叉树的结点结构,并使用递归函数yezi来计算叶子结点个数。 五、运行与测试 在测试中,我们可以输入二叉树的结点数据,然后输出叶子结点个数。例如,如果我们输入...
Locate 函数可以在索引表中查找是否存在与 wd 相同的关键字,InsertNewKey 函数可以在索引表的第 i 项上插入关键字 wd,并初始化书号索引为空链表,Append 函数可以存放书号索引链表 bnolist 中插入新的结点,Insert...
实现哈夫曼算法的前提是要考虑用什么样的存储结构来存储一棵哈夫曼树。在哈夫曼树中,没有度为1...既然结点总数可以确定,就可以采用顺序存储结构来实现,即可以把结点信息存放在大小为2n-1的一维数组(如数组ht)中。
1 、顺序存储方法:它是把逻辑上相邻的结点存储在物理位置相邻的存储单元里,结点间的逻辑关系由存储单元的邻接关系来体现。由此得到的存储表示称为顺序存储结构,通常借助程序语言的数组描述。 2 、链接存储方法:...
在查找 30 数据时,会把 15、56、77 这些页结点加载到内存中,使用二分查找算法定位到目标数据。 B+ 树的优点 B+ 树的精髓便在页结点中的元素不带数据,单个页结点便能存储更多的元素(N*N*N)。这使得 B+ 树可以...
0. 遍历: 1. 结点总数 2. 叶子结点总数 3. 分支结点的总数 4. 度为2的结点的个数 5. 遍历树时显示每个结点的层号 6. 树的深度 7. 遍历时只输出树的第i层结点