利用XML 与XSL 开发一个易于修改和扩充的用户手册

使用xslt转化xml数据形成word文档导出 做项目是时候经常会碰到要导出word文档,比如做OA系统会导出公文、导出请假单等等。一种方法是可以使用office组件Microsoft.Office.Interop.Word来操作word文档模板,替换书签得到最终的word文挡输出,不好的地方就是要依赖已winword.exe进程。另一只方法就是要说的使用xslt转化xml数据来得到最终的word文档。 立即下载

版权声明: 本文可以任意转载,转载时请务必以超链接形式标明文章原始出处和作者信息。
原文出处: http://www.aiview.com/notes/xml_xsl_manual.htm
作者: 张洋 Alex_doesAThotmail.com
最后更新: 2001-12-15


 目录
  1. 用户的需求
  2. 对应的技术实现
  3. 定义DTD
  4. 如何准备手册内容
  5. 最关键的部分: 开发XSL
  6. 将各部分粘合起来
  7. 参考资源

本文将介绍利用XML与XSL技术内容与表示相分离的特点,创建一个易于扩充,结构灵活的用户手册文档。当然,本文的重点在于阐述一种利用XML的方法,并不仅限于用户手册文档,您可以利用在任何您认为需要的地方。

本文介绍的内容基于XML、XSL与DTD技术规范,您可以使用IE5.0及其以上版本进行测试。

用户的需求

从用户的视角,我们要实现的用户手册包含以下几个部分:

  • 在页面左侧的导航栏,利用树状显示每一个级别的标题,每个标题前按顺序标有标题序号,形如2.1或2.1.8,对于包含子标题的标题要与不包含子标题的标题,即叶子标题区分显示,前面用不同的图片区分。
  • 页面右侧是内容栏,除包含各级标题外,还包含各级标题下的具体内容,内容类型有文字和图片。不同级别的标题要使用不同的现实方式,每个标题前也加有标题序号,与左侧导航栏一致。
  • 对于含有图片的内容部分,图片显示为缩略图,通过点击可以在正常大小与缩略图之间切换。
  • 点击左侧导航栏的标题,可以定位到右侧的相关内容。
  • 对于手册的标题和内容,应该可以方便添加与删除,修改了一个标题的级别,比如从一级标题换到三级标题的位置,其显示风格可以自动更改。理论上,标题的级别可能会有无限多层。
  • 无论是左侧的导航栏,还是右侧的内容区域,用户只对标题的相对位置和级别负责,标题前面的序号要求自动生成。
对应的技术实现

我们打算开发如下几个部分来实现这个用户手册:

  • 一个DTD定义文件,即Document Type Defination(文档类型定义)。定义这个文件需要根据客户对于手册的需求来做,这也是我们需要首先着手去做的部分。
  • 一 个XML文档,包含了用户手册的真实的、具体的内容,这个文档当然应该是良构的,需要遵循我们在上面DTD文件中定义的规则。这个文档的内容由手册的编写 者来提供,他无需了解其他的技术细节,只需遵照一个简单的规则即可,如果能够使用像XMLSPY这样的工具编辑会更省力。
  • 两个XSL文件,这是我们需要开发的主体部分,也就是决定内容将如何呈现给用户,共有两个XSL文件,分别针对左侧的导航栏和右侧的内容主体。
  • 一个超文本文件,构成用户手册的框架,实现导航栏与内容主体的分割。
定义DTD

通过前面的需求陈述,可以抽象出如下页面元素:

  • 标题,会有不同的级别
  • 内容,包括文本和图片

为此我们定义如下DTD元素:

	<!ELEMENT Image (#PCDATA)>
	<!ELEMENT Para (#PCDATA)>
	<!ELEMENT Name (#PCDATA)>

分别表示图片、段落文本和标题。为了表示标题的嵌套关系,我们又定义一个Item元素,把它作为一个块,不同的Item之间可以是平行关系,也可以是嵌套关系,所有的基本元素(图片、段落文本和标题)必须从属于一个Item。具体的关系描述如下:

  • 一个Item中只能包含、并且必须包含一个标题(Name)
  • 一个Item中可以同时包含多段文字或者多张图片,或者只包含其中一种
  • 一个Item中可以嵌套一个或多个Item,也可以不嵌套任何Item,嵌套的Item具有相同的属性

通过以上描述,我们可以定义元素Item:

<!ELEMENT Item (Name, (Para | Image)*, Item*)>

元素名称后面的'*' 代表此元素可以为0个或者多个。

'(Para | Image)*' 与 'Para*, Image*' 同义。

作为DTD,还必须定义一个根元素,我们起名为'PMS_Help',它将包含Item元素,进而间接的包含了所有的元素。

<!ELEMENT PMS_Help (Item*)>

上面表示为,使用了这个DTD的XML文档中可以定义0个或者多个Item元素。

此外,我们还需要为图片的缩略图定义:

<!ATTLIST Image small ID #IMPLIED>

至此,DTD文件我们就已经定义完了,我们将其保存为PMS_Help.dtd,这里下载完整的DTD文件。

如何准备手册内容

接下来我们要根据上面定义的DTD文件,整理含有实际内容的XML文件,文件内容示例如下:

<PMS_Help>

    <Item>

        <Name>第一级别标题</Name>
            <Item>

                <Name>第二级别标题</Name>

                    <Item>

                        <Name>第三级别标题</Name>
                        <Para>段落文本1</Para>

                        <Image small="image1_small.gif">image1.gif</Image>

                        <Para>段落文本2</Para>

                        <Para>段落文本3</Para>
                    </Item>

                    <Item>

                    ...
                    </Item>
            </Item>

            <Item>
            ...
            </Item>

    </Item>       

    <Item>
    ...
    </Item>

</PMS_Help>

在第三级标题下面,当然还可以继续嵌套Item元素,有更多级别的标题,只要你在下面的XSL样式文件中对应说明了这个级别标题如何显示即可。

在Para标记之间的文本在显示时会被格式化为一个段落,如果你有多段文本,应该分别用Para进行标记。

Image标记中有一个属性字段small,其值应是一个图片文件名,这个图片用作默认的缩略图显示,当点击这个图片,会显示出Image标记之间的图片文件,当然您也可以对着两个图片使用同一个文件名。图片文件的路径不需要在这里指定,路径是写在下面XSL文件中的。

当我们把包含手册内容的XML文件准备好之后,我们还需要做一个额外的工作,就是将此XML文件复制一份,两个文件分别取名为:PMS_Help.xml, PMS_Help_Lf.xml,两个文件分别绑定不同的XSL样式文件,以取得不同的显示效果,除此以外,两个XML文件是完全相同的。下载两个XML文件:导航栏XML文件,内容栏XML文件

最关键的部分: 开发XSL

1. 首先实现相对简单一点的对应左侧导航栏的XSL文件。

XML文件以一定的结构描述了我们要展现的内容,而在XSL当中,决定了这些内容将以何种方式展现,实际上是XSL是将XML文档格式化为浏览器可 以理解的HTML格式文本,在XSL中首先需要定义根级的模板,实际对应了HTML文档的Head以及Body部分,代码如下:

	<xsl:template match="PMS_Help">

		<html>

			<head>
				<title>Index</title>

				<style media="screen">
					<xsl:comment><![CDATA[
						body {font-fimaly:'宋体',Arial; font-size:9pt; color:#000000;}
					]]></xsl:comment>

				</style>
			</head>
			<body>

				<h2>Index</h2>
				<p/>

				<xsl:for-each select="Item">
					<xsl:apply-templates select="."/>
				</xsl:for-each>

			</body>
		</html>

	</xsl:template>
 

接下来实现对应处理Item部分的模板:

	<xsl:variable name="allParentNode" select="ancestor::Item/Name"/>

		<xsl:variable name="allChildNode" select="child::Item/Name"/>

		<xsl:variable name="numOfAllParentNode" select="count($allParentNode) + 1"/>

		<xsl:variable name="numOfAllChildNode" select="count($allChildNode)"/>
		<!-- output the Index of help BEGIN -->

		<xsl:element name="div">

			<xsl:attribute name="onclick">
				window.open('PMS_Help.xml#<xsl:number count="Item" level="multiple" format="01-01-01"/>','main')
				<!-- <xsl:value-of select="&quot;alert(this.id)&quot;" /> --></xsl:attribute>

			<xsl:attribute name="style"><xsl:value-of select="concat('text-indent:',(($numOfAllParentNode - 1) * 30),';white-space: nowrap')"/></xsl:attribute>

			<xsl:attribute name="id"><xsl:number count="Item" level="multiple" format="01-01-01"/></xsl:attribute>

			<xsl:attribute name="onmouseover"><xsl:value-of select="&quot; this.style.color='red';this.style.cursor='hand' &quot;"/></xsl:attribute>

			<xsl:attribute name="onmouseout"><xsl:value-of select="&quot; this.style.color='black' &quot;"/></xsl:attribute>

			<xsl:choose>
				<xsl:when test="$numOfAllParentNode = 0">
					<img src="images/page/minus.gif" alt="" border="0"/>

				</xsl:when>
				<xsl:when test="$numOfAllParentNode != 0 and $numOfAllChildNode = 0">

					<img src="images/page/passage.gif" alt="" border="0"/>

				</xsl:when>
				<xsl:otherwise>

					<img src="images/page/minus.gif" alt="" border="0"/>
				</xsl:otherwise>

			</xsl:choose>
			<xsl:number count="Item" level="multiple"/>_
			<xsl:value-of select="Name"/>
		</xsl:element>

		<!-- 如果还存在下一级Item,则递归调用此模板 -->
		<xsl:if test="count(Item)>0">

			<xsl:apply-templates select="Item"/>
		</xsl:if>
	</xsl:template>

 

在上面的代码中,我们通过如下的方式定义变量:

	<xsl:variable name="allParentNode" select="ancestor::Item/Name"/>

其中,allParentNode是我们为变量取的名字,后面使用select关键字为其赋值,ancestor关键字用于取出后面给定节点的所有父节点,Item/Name是我们在DTD中定义的节点名称。之后我们可以通过 $allParentNode 来引用这个变量。接下来我们使用:

<xsl:variable name="numOfAllParentNode" 

select="count($allParentNode) + 1"/>

取出当前节点所有父节点的数量。使用以下代码能够在XSL当中实现一个类似case语句的功能,用来判断是否是叶子节点,以显示不同的图片。

	<xsl:choose>

		<xsl:when test="$numOfAllParentNode = 0">
			<img src="images/page/minus.gif" alt="" border="0"/>

		</xsl:when>

		<xsl:when test="$numOfAllParentNode != 0 and $numOfAllChildNode = 0">
			<img src="images/page/passage.gif" alt="" border="0"/>

		</xsl:when>
		<xsl:otherwise>
			<img src="images/page/minus.gif" alt="" border="0"/>
		</xsl:otherwise>

	</xsl:choose>

由于我们的DTD中不限制Item定义的级别,因此,我们需要递归的处理Item的显示,使用如下语句:

	<xsl:if test="count(Item)>0">
		<xsl:apply-templates select="Item"/>
	</xsl:if> 

我们将此XSL文件保存为PMS_Help_Lf.xsl,下载此文件。

2. 接下来实现对应右侧具体内容展示的XSL。

同样,也需要定义Head和body部分,不同的是,这里定义了更加复杂的样式单(CSS),并增加了一段Javascript脚本:

	<xsl:template match="PMS_Help">	
		<html>
			<head>

				<title>Content</title>

				<style media="screen, print">
					<xsl:comment><![CDATA[
						body {font-fimaly:'宋体',Arial; font-size:9pt; color:#000000;}
						.Title1 {font-fimaly:'宋体'; font-size:17.2pt; color:#333333; font-weight:bold; margin-left:0pt; background-color:#eeeeee; white-space: nowrap}
						.Title2 {font-fimaly:'宋体'; font-size:14pt; color:#000000; font-weight:bold; margin-left:0pt; white-space: nowrap}
						.Title3 {font-fimaly:'宋体'; font-size:12pt; color:#333333; font-weight:bold; margin-left:90pt; background-color:#eeeeee; white-space: nowrap}
						.Title4 {font-fimaly:'宋体'; font-size:12pt; color:#000000; font-weight:bold; margin-left:90pt; white-space: nowrap}
						.Title5 {font-fimaly:'宋体'; font-size:10pt; color:#333333; font-weight:bold; margin-left:160pt; background-color:#eeeeee; white-space: nowrap}
						.Title6 {font-fimaly:'宋体'; font-size:10pt; color:#000000; font-weight:bold; margin-left:160pt; white-space: nowrap}
						.Para1 {font-fimaly:'宋体'; font-size:9pt; color:#333333; margin-left:90pt}
						.Para2 {font-fimaly:'宋体'; font-size:9pt; color:#333333; margin-left:90pt}
						.Para3 {font-fimaly:'宋体'; font-size:9pt; color:#333333; margin-left:90pt}
						.Para4 {font-fimaly:'宋体'; font-size:9pt; color:#333333; margin-left:90pt}
						.Para5 {font-fimaly:'宋体'; font-size:9pt; color:#333333; margin-left:160pt}
						.Para6 {font-fimaly:'宋体'; font-size:9pt; color:#333333; margin-left:160pt}
						.image {cursor:hand}
					]]></xsl:comment>
				</style>

				<script>
					<xsl:comment><![CDATA[
						/* 当用户点击图片时,交替显示缩略图和全图 */
						function swapImg(which, small, normal){
							var s = "/";
							//alert(which + '|' + small + '|' + normal);
							//alert(which.src.substring(which.src.lastIndexOf(s)+1));
							if (which.src.substring(which.src.lastIndexOf(s)+1) == small){
								which.src = 'images/' + normal;
								which.alt = '===> 缩小 <===';
							}
							else{
								which.src = 'images/' + small;
								which.alt = '<=== 放大 ===>';
							}
						}
					]]></xsl:comment>

				</script>

			</head>
			<body>
				<a name="top"/>
				<h2>Content</h2>

				<p align="right">

					<a href="mailto:yourname@yourdomain.com">EMail to us</a><xsl:text> </xsl:text><a href="javascript:print()">打印本手册</a>
				</p>

				<xsl:for-each select="Item">

					<xsl:apply-templates select="."/>
				</xsl:for-each>
			</body>
		</html>
	</xsl:template>

接下来是处理Item的部分:

	<xsl:template match="Item">
		<xsl:variable name="allParentNode" select="ancestor::Item/Name"/>
		<xsl:variable name="allChildNode" select="child::Item/Name"/>

		<xsl:variable name="numOfAllParentNode" select="count($allParentNode) + 1"/>

		<xsl:variable name="numOfAllChildNode" select="count($allChildNode)"/>

		<!-- output the content of help -->

		<!-- 显示各级标题 -->
		<xsl:element name="a">
			<xsl:attribute name="name"><xsl:number count="Item" level="multiple" format="01-01-01"/></xsl:attribute>

		</xsl:element>

		<xsl:element name="div">
			<xsl:attribute name="class"><xsl:value-of select="concat('Title', $numOfAllParentNode)"/></xsl:attribute>
			<xsl:number count="Item" level="multiple"/><xsl:text> </xsl:text>

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

			<!-- 级别为奇数的标题下加横线 -->
			<xsl:if test="$numOfAllParentNode = 1 or ($numOfAllParentNode mod 2) != 0">
				::<a href="#top" target="_self">top</a>

				<hr size="1" noshade="noshade"/>
			</xsl:if>

		</xsl:element>
		<p/>

		<!-- 如果还存在下一级Item,则递归调用此模板 -->

		<xsl:if test="count(Item)>0">
			<xsl:apply-templates select="Item"/>

		</xsl:if>
		<!-- 如果不存在下一级标题,显示段落和图片内容 -->

		<xsl:if test="count(Item)=0">

			<xsl:apply-templates select="Para | Image"/>
		</xsl:if>
	</xsl:template>

 

为了以不同的样式显示不同级别的标题我们做了如下处理,根据级别的不同,选择不同的样式单(CSS)定义:

	<xsl:attribute name="class"><xsl:value-of select="concat('Title', $numOfAllParentNode)"/></xsl:attribute>

额外的,我们在级别为奇数的标题下画上横线:

	<!-- 级别为奇数的标题下加横线 -->
	<xsl:if test="$numOfAllParentNode = 1 or ($numOfAllParentNode mod 2) != 0">

		::<a href="#top" target="_self">top</a>
		<hr size="1" noshade="noshade"/>

	</xsl:if>
 

同样的,我们也需要递归调用此模板进行处理:

 	<!-- 如果还存在下一级Item,则递归调用此模板 -->
	<xsl:if test="count(Item)>0">
		<xsl:apply-templates select="Item"/>

	</xsl:if>

与上一个XSL不同,我们在这里还需要处理Para和Image标记,这些内容在导航栏是不需要显示的。我们定义了模板:

 	<xsl:template match="Para | Image">

		<xsl:variable name="allParentNode" select="ancestor::Item/Name"/>

		<xsl:variable name="numOfAllParentNode" select="count($allParentNode) + 1"/>

		<!-- 如果节点是Para,显示段落 -->
		<xsl:if test="self::Para">
		<xsl:element name="div">

			<xsl:attribute name="class"><xsl:value-of select="concat('Para', ($numOfAllParentNode) - 1)"/></xsl:attribute>
			<p>

				<xsl:value-of select="."/>
			</p>

		</xsl:element>

		</xsl:if>
			
		<!-- 如果节点是Image,显示图片 -->

		<xsl:if test="self::Image">
			<xsl:variable name="small" select="normalize-space(@small)"/>

			<xsl:variable name="normal" select="normalize-space(.)"/>
			<xsl:element name="div">

				<xsl:attribute name="class"><xsl:value-of select="concat('Para', ($numOfAllParentNode) - 1)"/></xsl:attribute>

				<xsl:element name="img">
					<xsl:choose>
						<xsl:when test="boolean($small)">
							<xsl:attribute name="src">images/<xsl:value-of select="$small"/></xsl:attribute>

							<xsl:attribute name="alt">&lt;=== 放大 ===&gt;</xsl:attribute>
							<xsl:attribute name="onclick"><xsl:value-of select="concat('swapImg(this, &quot;',$small,'&quot;,&quot;',$normal,'&quot;)')"/></xsl:attribute>

						</xsl:when>

						<xsl:when test="not(boolean($small))">
							<xsl:attribute name="src">images/<xsl:value-of select="$normal"/></xsl:attribute>
						</xsl:when>

					</xsl:choose>

					<xsl:attribute name="class">image</xsl:attribute>
					<xsl:attribute name="border">0</xsl:attribute>
				</xsl:element>

				<p/>

			</xsl:element>
		</xsl:if>
	</xsl:template>

通过onclick属性,我们为图片定义了onclick事件,以处理缩略图与正常大小图片之间的转换:

 	<xsl:attribute name="onclick"><xsl:value-of select="concat('swapImg(this, &quot;',$small,'&quot;,&quot;',$normal,'&quot;)')"/></xsl:attribute>

这个XSL文件我们保存为PMS_Help.xsl,下载此XSL文件。

将各部分粘合起来

最后写一个HTML文件,定义两个框架,将两个XML文件粘合起来,点此查看此用户手册的效果。

回顾一下,此用户手册包含:

  • 一个DTD文件,用于定义XML文档的结构。此文件在XML文件中被引用,但并不是强制性的,换句话说,你可以根本就不生成这个文件,但实际上你必须遵循一定的规则来编写XML文件以及实现你的XSL样式文件。
  • 两个XML文件,包含了手册的实际内容。这两个文件除了链接的XSL样式文件不同外,其他完全相同。
  • 两个XSL样式文件,在以上的两个XML文件中被引用。一个用于格式化左侧导航栏显示,一个用于格式化右侧具体内容显示。
  • 一个超文本文件,用于粘合两个XML文件。

 

参考资源

XML+xsl讲XML文档的内容用xsl建表 XML+xsl讲XML文档的内容用xsl建表。 立即下载

相关推荐

xml+xsl

博文链接:https://xinlingwuyu.iteye.com/blog/200357

XML使用手册

XML简介 (我觉得和HTML比较像,学过h5问题不大) 可扩展标记语言(eXtensible Markup Language)。 特性: 1.xml具有平台无关性, 是一门独立的标记语言. 2.xml具有自我描述性 为什么学习XML? 1.网络数据传输. 2.数据存储 3.配置文件 XML文件 .XML文件是保存XML数据的一种方式 XML数据也可以以其他的方式存在(如在内存中构建XML数据)。 不要将XML语言狭隘的理解成XML文件。 XML语法格式 1.XML文档声明 <?xml v

砖业手艺混子的博客 1034

C# NX二次开发:两种过滤器设置方案的实战解析与场景适配

本文深入解析C# NX二次开发中的两种过滤器设置方案:AddFilterHandler回调与MaskTriple属性设置。通过实战案例对比其性能差异与适用场景,帮助开发者根据需求选择最优方案,提升NX插件开发效率与交互体验。特别针对BlockStyler集成场景提供专业建议,是NX二次开发者的实用指南。

weixin_33739646的博客 844

使用xml文件生成在线帮助文档

目前,很多系统或工具都会提供相应的在线帮助文档,

vipshop_ebs的专栏 1455

AI视频生成本地搭建图文详细过程

在自己的电脑上搭建一个AI,主要用于通过自己输入的关键字来自动生成视频文案,把视频文案自动生成视频,再自动给视频配音配字幕。

张小三的博客 4692

第17篇:深入解析OpenEuler 24.03系统中的逻辑卷管理(LVM)

OpenEuler 24.03系统中的逻辑卷管理(LVM)提供了灵活的存储管理方案,通过在物理存储与文件系统间构建抽象层实现动态资源分配。

专注于系统运维、数据库、DevOps、虚拟化技术、docker、kubernetes、等云原生技术。 1689

用xslt格式化xml文件

用xslt格式化指定的xml文件,以字符串格式输出,并保存。 config/Common.xml 文件 <?xml version="1.0" encoding="utf-8"?> <?xml-stylesheet type="text/xsl" href="Common.xslt"?> <configuration> <servi...

andao9621的博客 227

下载MNIST数据集并使用python将数据转换成NumPy数组(源码解析)

下载MNIST数据集并使用python将数据转换成NumPy数组首先来分析init_mnist函数接下来继续分析load_mnist函数实现数据集转换的python脚本的代码显示MNIST图像并确认数据 下载MNIST数据集并将数据转换成NumPy数组的Python脚本里面最重要的就是load_mnist函数,其他项目想要调用数据集的话,就可以调用load_mnist函数,得到一个字典类型的数据,字典的值是一个Numpy数组。 这些过程是如何实现的,现在开始逐字逐句分析源码: 在load_mnist函数中第

及时总结 4268

XPath学习:轴(3)——descendant

XPath 是一门在 XML 文档中查找信息的语言。XPath 可用来在 XML 文档中对元素和属性进行遍历。 XPath 是 W3C XSLT 标准的主要元素,并且 XQuery 和 XPointer 同时被构建于 XPath 表达之上。 推荐一个挺不错的网站:http://www.zvon.org/xxl/XPathTutorial/General_chi/e...

weixin_30853329的博客 313

SAP RAP 里的 EML 全解:从语言定位到事务语义,再到真实案例的落地方式

摘要:EML(Entity Manipulation Language)是ABAP RAP模型的核心组件,作为ABAP的子集用于操作业务对象(BO)。它通过声明式语法(READ/MODIFY/EXECUTE/COMMIT)统一访问BO的行为与数据,并由RAP运行时自动处理校验、锁定、草稿管理等生命周期。EML将业务语义融入代码,确保与Fiori应用共享同一套校验逻辑,并通过FAILED/REPORTED/MAPPED管道传递错误与消息。其事务控制(IN LOCAL MODE与COMMIT ENTITIES)

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 528

第七天 Labview进阶(7.2 与汇川PLC通信)

运行环境: Labview 2020 Autoshop v4.10.1.1 该文档中包括Labview程序和汇川PLC程序,可以完美实现Labview与汇川PLC的通信。具体的使用教程可以参考本人的相关文章,讲解详尽,请尽情享用!

weixin_38637405的博客 3527

XSL中调用模板的时候传递可变参数

出处:https://q.cnblogs.com/q/33130/ 为了控制转换得到的格式: xsl:if test="count(ancestor::*)=4"> xsl:copy-of select="$show_lead_space_depth_4"/> xsl:if> xsl:if test="count(ancestor::*)=6

work hard 883

Agentic AI商业化落地指南:提示工程架构师的7步优化法

Agentic AI(具备自主感知、决策与行动能力的智能体系统)是未来AI商业化的核心方向,其价值在于将大模型的“认知能力”转化为“实际行动”,解决复杂商业场景中的自动化与个性化需求。而提示工程(Prompt Engineering)作为连接人类意图与智能体行为的“翻译器”,直接决定了智能体的可控性、效率与用户体验,是Agentic AI商业化落地的关键支撑。本文结合第一性原理与工程实践,提出提示工程架构师的“7步优化法”,覆盖从“商业目标定义”到“规模化推广”的全流程。通过理论框架推导架构设计拆解。

AI架构全栈开发实战笔记 1万+

XML应用-利用XML 与XSL 开发一个易于修改和扩充的用户手册

 版权声明: 本文可以任意转载,转载时请务必以超链接形式标明文章原始出处和作者信息。原文出处: http://www.aiview.com/notes/xml_xsl_manual.htm作者: 张洋 Alex_doesAThotmail.com最后更新: 2001-12-15 目录用户的需求 对应的技术实现 定义DTD 如何准备手册内容

农民田园 1012

LDRA Testbed(TBrun)软件单元测试_实例讲解(对多次调用的函数打桩)

在之前的文章《LDRA Testbed(TBrun)软件单元测试_操作指南》中,已经讲解了如何使用TBrun进行软件单元测试的基本操作步骤。本篇文章将结合实例进一步讲解被测函数中包含多次调用其他函数时,如何对其打桩来实现测试目的(详细的操作流程本文不再重述,若有不清楚的,可以结合之前的操作指南一起来看)。本文以一个被测函数作为示例,讲解了如何使用Testbed(TBrun)对涉及到多次调用其他函数的被测函数进行单元测试。本文的示例可能比较简单,但是思路、方法和流程都是通用的,希望对大家有所帮助。

文章主要涉及嵌入式软件开发、测试、项目管理等,欢迎交流,共同进步。 1462

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

XSLT如何实现xml的格式化输出

本文将介绍利用XML与XSL技术内容与表示相分离的特点,创建一个易于扩充,结构灵活的用户手册文档。当然,本文的重点在于阐述一种利用XML的方法,并不仅限于用户手册文档,您可以利用在任何您认为需要的地方。 本文介绍的内容基于XML、XSL与DTD技术规范,您可以使用IE5.0及其以上版本进行测试。 用户的需求 从用户的视角,我们要实现的用户手册包含以下几个部分: 在页面左侧的导航...

weixin_30246221的博客 243

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

VC++中利用MSXML解析XML文档

一、 XML 简介   XML(Xtensible Markup Language,即扩展标记语言)的发展起源于1996年。当时,出版界巨头和Web业内人士经过共同讨论,提出了创建SGML(Standard Generalized Markup Language,即标准通用标识语言)子集(HML)的建议。该子集专用于Web,具有可扩展(或可扩充)性,并且能利用结构化标记语言的所有高级功 能,但摒弃

Chinawash 专栏 1462

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

最常用的PHP解析XML的函数

一、小序      HTML简单易学又通用,一般的PHP程序就是嵌入在HTML语言之中实现的。但是随着WEB越来越广泛的应用,HTML的弱点也越来越明显了。XML的出现,弥补了这些不足,它提供了一个能够处理互联网上全部数据的通用方法。      二、HTML的局限性分析      1、 HTML的可扩展性差。虽然作为一般的应用,HTML应经够用了,但是在处理数学和化学等符号时,HTML

袁成敏的专栏 770

基于FPGA与ADF4351的3GHz信号源设计:SPI时序与寄存器配置实战

锁相环(PLL)频率合成是射频系统中生成稳定本振与激励信号的核心技术。ADF4351作为集成压控振荡器的宽带频率合成器,可在35MHz至4.4GHz范围内输出可编程频率信号。通过SPI接口写入分频比、输出功率等寄存器参数,即可精确设定输出频率。FPGA以并行控制和确定性时序在系统集成中更具优势,尤其适用于多通道同步或需嵌入自动扫频逻辑的场景。本文以3GHz点频源为例,介绍Verilog实现SPI时序、寄存器计算方法、硬件连接与频谱实测,并提供可直接复用的工程代码。适合射频调试、仪表替代与FPGA时序控制学习

ciya3282的博客 456

VC++中利用MSXML解析XML、使用DOM写XML文档

CoInitialize(NULL); // 初始化COM。 CComPtr<IXMLDOMDocument> spXMLDOM; // 创建解析器实例。 HRESULT hr = spXMLDOM.CoCreateInstance (__uuidof(DOMDocument)); VARIANT_BOOL bSuccess = false; // 装载XML文档。 hr = spXMLDOM->load(CComVariant(L"xmlfile.xml"), &..

thanklife的专栏 1959

XML

一、XML定义:XML即可扩展标记语言(eXtensible Markup Language)。标记是指计算机所能理解的信息符号,通过此种标记,计算机之间可以处理包含各种信息的文章等。如何定义这些标记,既可以选择国际通用的标记语言,比如HTML,也可以使用象XML这样由相关人士自由决定的标记语言,这就是语言的可扩展性。XML是从SGML中简化修改出来的。它主要用到的有XML、XSL和XP...

aifeimiao1189的博客 168

XML的相关概念

XML 可扩展标记语言(英语:eXtensible Markup Language,简称:XML),是一种标记语言。标记指计算机所能理解的信息符号,通过此种标记,计算机之间可以处理包含各种信息的文章等。如何定义这些标记,既可以选择国际通用的标记语言,比如HTML,也可以使用像XML这样由相关人士自由决定的标记语言,这就是语言的可扩展性。XML是从标准通用标记语言(SGML)中简化修改出来的。它主

jamesjxin的专栏 519
上一篇: 学习笔记-Linux 系统管理学习笔记(二)
下一篇: UML应用-应用Rational Rose 进行状态机分析与设计实例
alexdoes
博客等级 码龄23年 2粉丝 25原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值