三,制作编码的模板
制作模块可是颇费功夫的一件事情。由于之前对xslt的语法和使用方法比较陌生,所以在上面花了不少时间。幸好有 仙桃人 的大力帮助,才搞明白了XSLT的用法。
起初,使用VS.Net 2003创建了一个xslt文件,然后,在里面添加了一个template进去。可是,不知怎么了总在XslTransform类Load这个xslt文件时报错,加上当时使用debug mode来运行程序,没有任何提示信息害我浪费不少时间。后来才发现,VS.Net 2003生成的xlst中没有给出xls的namespace,所以无法解释<xsl:template></xsl:template>。真是害我不浅。不过经过一番努力,还是搞定了这些问题。
这里有一些关键点:
(1) 生成属性所需的private变量。
这里主要使用<xsl:for-each></xsl:for-each>语句来遍历数据字段,来生成所需要的变量。
1
<
xsl:for-each
select
="FIELDS/FIELD"
>
2
dim m_
<
xsl:value-of
select
="@Name"
/>
as
<
xsl:value-of
select
="@Type"
/>
3
</
xsl:for-each
>

2

3

(2)构建函数中参数的生成。
这里同样使用<xsl:for-each></xsl:for-each>来成才参数,但要注意末尾才是的逗号问题。
1
<
xsl:for-each
select
="PrimaryKeys/FIELD"
>
2
<
xsl:if
test
="position()!=count(../*)"
>
Byval p
<
xsl:value-of
select
="@Name"
/>
as
<
xsl:value-of
select
="@Type"
/>
,
</
xsl:if
>
3
<
xsl:if
test
="position() = count(../*)"
>
Byval p
<
xsl:value-of
select
="@Name"
/>
as
<
xsl:value-of
select
="@Type"
/></
xsl:if
>
4
</
xsl:for-each
>

2

3

4

(3)用另外一个template来获取Element的属性(取table name)
1
<
xsl:template
match
="//TableName"
>
2
<
xsl:value-of
select
="@value"
/>
3
</
xsl:template
>

2

3

最后写全的xlst如下面:
1
<?
xml version="1.0" encoding="UTF-8"
?>
2
<
xsl:stylesheet
version
="1.0"
xmlns:xsl
="http://www.w3.org/1999/XSL/Transform"
>
3
<
xsl:output
method
="xml"
omit-xml-declaration
="yes"
indent
="yes"
/>
4
<
xsl:template
match
="/Schema"
>
Namespace Data
5
Public Class Entity
<
xsl:apply-templates
select
="//TableName"
/>
6
7
'variable
<
xsl:for-each
select
="FIELDS/FIELD"
>
8
dim m_
<
xsl:value-of
select
="@Name"
/>
as
<
xsl:value-of
select
="@Type"
/>
9
</
xsl:for-each
>
10
11
Public Sub New()
12
13
End Sub
14
15
Public Sub New(
<
xsl:for-each
select
="PrimaryKeys/FIELD"
><
xsl:if
test
="position()!=count(../*)"
>
Byval p
<
xsl:value-of
select
="@Name"
/>
as
<
xsl:value-of
select
="@Type"
/>
,
</
xsl:if
><
xsl:if
test
="position() = count(../*)"
>
Byval p
<
xsl:value-of
select
="@Name"
/>
as
<
xsl:value-of
select
="@Type"
/></
xsl:if
></
xsl:for-each
>
)
16
<
xsl:for-each
select
="PrimaryKeys/FIELD"
>
17
m_
<
xsl:value-of
select
="@Name"
/>
= p
<
xsl:value-of
select
="@Name"
/>
18
</
xsl:for-each
>
19
End Sub
20
21
Public Sub New(
<
xsl:for-each
select
="FIELDS/FIELD"
><
xsl:if
test
="position()!=count(../*)"
>
Byval p
<
xsl:value-of
select
="@Name"
/>
as
<
xsl:value-of
select
="@Type"
/>
,
</
xsl:if
><
xsl:if
test
="position() = count(../*)"
>
Byval p
<
xsl:value-of
select
="@Name"
/>
as
<
xsl:value-of
select
="@Type"
/></
xsl:if
></
xsl:for-each
>
)
22
<
xsl:for-each
select
="FIELDS/FIELD"
>
23
m_
<
xsl:value-of
select
="@Name"
/>
= p
<
xsl:value-of
select
="@Name"
/>
24
</
xsl:for-each
>
25
End Sub
26
<
xsl:for-each
select
="FIELDS/FIELD"
>
27
Public Property
<
xsl:value-of
select
="@Name"
/>
() As
<
xsl:value-of
select
="@Type"
/>
28
Get
29
Return m_
<
xsl:value-of
select
="@Name"
/>
30
End Get
31
Set(ByVal Value As
<
xsl:value-of
select
="@Type"
/>
)
32
m_
<
xsl:value-of
select
="@Name"
/>
= Value
33
End Set
34
End Property
35
</
xsl:for-each
>
36
End Class
37
End Namespace
</
xsl:template
>
38
<
xsl:template
match
="//TableName"
>
39
<
xsl:value-of
select
="@value"
/>
40
</
xsl:template
>
41
</
xsl:stylesheet
>

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

-- 未完带续
相关链接: 使用XML + XSLT进行实体类代码生成 (一)