用xsl在多个xml中解析的问题?

fangss 2003-04-01 02:07:27
<<a.xml>>
...
<data name="message" id="01" xmlTag="msg"/>
<item name="message1" id="02" xmlTag="msg1"/> //此处data,item为灵活.

...

<<b.xml>>
...
<msg>question</msg>
<msg1>1 question</msg1>
...

如何用xsl解析b.xml时,引入a.xml并把属性name取出.
以上结果为:
message:question
message1:1 question


question 为b.xml中的数据,依据<msg>在a.xml中找到xmlTag为msg的name取出,为message.<msg1>也如此.
...全文
74 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
fuchunjie 2003-04-09
  • 打赏
  • 举报
回复
这就是变量中的变量问题嘛。
参考办法有如下三个:
1.select="//data/@xmlTag"中的data因为是不确定的,直接用<xsl:for-each select="//@xmlTag"></xsl:for-each>查找a.xml中的所有@xmlTag的值,然后再处理。这样的话,就可以跳过data/item/elem1/elem2等不知道tag名字了。注意,这样将会循环到a.xml中的所有属性xmlTag的值。
2.虽然不知道名称(可能是data,或data1或data3等),但名称的生成规则程序员肯定知道的,比如是根据abc与关键字ID的组合,或是数字自加1等等,这在生成a.xml时能取到这些tag的名称的,在这里你以同样的规则去获取select="//data/@xmlTag中的data即可。
3.在a.xml中新建一个结点,把所有tag的名称以空格格开组成一个字串,然后把这字串作为新结点的值。这样当作xsl解析时,又以空格化开该字串,对每个值去取select="//$var/@xmlTag即可。

不晓得能否解决问题,还是多加点分啊 :)
fangss 2003-04-08
  • 打赏
  • 举报
回复

哎,原来还没说明白,先加50分吧,以资鼓励;-)
fangss 2003-04-08
  • 打赏
  • 举报
回复
多谢!

此处data,item灵活的意思指的是可以是data,item,也可以是elem1,elem2等等,我是不知道的.
也就是不能用
select="//data/@xmlTag"中的data因为是不确定的,
data1,data2,elem1,elem2...都有可能.
要根据xmlTag的值来确定,只要xmlTag的值是对的,在取得相应元素,再取得name属性.

question 为b.xml中的数据,依据<msg>在a.xml中找到xmlTag为msg的元素(data),属性name取出,为message.<msg1>也如此.

不知道这次说明没有.
fuchunjie 2003-04-07
  • 打赏
  • 举报
回复
<<a.xml>>
...
<data name="message" id="01" xmlTag="msg"/>
<item name="message1" id="02" xmlTag="msg1"/> //此处data,item为灵活.
此处data,item灵活。什么意思?是指data的拼写可变,还是data可以多个(包括0个)?
xmlTag对应的是b.xml中对应的tag名字,对吧?。下面分别讨论:

1.根据xmlTag取得b.xml中相对应tag的值,可以用变量来解决:
<xsl:variable name="xmltag" select="//data/@xmlTag"></xsl:variable>
取得b.xml中的值:<xsl:value-of select="//$xmltag"></xsl:value-of>

2.若data的拼写可变,那至少知道变化规则不吧,处理于1同。

3.若data可以多个,那用<xsl:for-each>循环读取就可以了。

你的灵活到底指的什么?
fangss 2003-04-04
  • 打赏
  • 举报
回复
是我不知道如何定为那个结点呀.
因为名字不知道:(

例子呢?
fuchunjie 2003-04-04
  • 打赏
  • 举报
回复
select后面加的是xpath语句啊。
你是要根据某些条件访问另外一个结点的值?
那得看看如何些XPath的书了:)
举个例子,看能否帮上你 ::))
fangss 2003-04-03
  • 打赏
  • 举报
回复
还没解决:(
document用的是没错,可难的是如何根据xmlTag属性的到相应节点的name属性.

在放几天,下周一定结贴.
希望还有好办法.
kreven 2003-04-03
  • 打赏
  • 举报
回复
果然厉害,不错,好方法,支持,兄弟你的问题解决了吧
fuchunjie 2003-04-02
  • 打赏
  • 举报
回复
xsl中为了获取另外XML数据集,可以使用document()函数。
document()函数将第二个XML数据集的内容作为一个节点集来返回——本质上,作为XML数据结构的一个分枝.
如:<xsl:variable name="b" select="document('b.xml')/msg"/>,则变量b的值是question.

vcvj 2003-04-01
  • 打赏
  • 举报
回复
XML File (document.xml)

<?xml version='1.0'?>
<?xml-stylesheet type="text/xsl" href="document.xsl" ?>
<groups>
<groupRef href="http://localhost/hr/hrGroup.xml"/>
<groupRef href="myGroup.xml"/>
</groups>
Referenced XML File 1 (hrGroup.xml)

<?xml version='1.0'?>
<group name="hr">
<leader>mo</leader>
<member>bo</member>
<member>ko</member>
<member>lo</member>
</group>
Referenced XML File 2 (myGroup.xml)

<?xml version='1.0'?>
<group name="my">
<leader>john</leader>
<member>jane</member>
<member>jon</member>
<member>jan</member>
</group>
XSLT File (document.xsl)

<?xml version='1.0'?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="/">
<groups>
<xsl:apply-templates select="//groupRef"/>
</groups>
</xsl:template>

<xsl:template match="groupRef">
<xsl:copy-of select="document(@href)//group"/>
</xsl:template>

</xsl:stylesheet>
Try It!

Copy the code samples above, and paste them into files on your local drive.
Save the files with the given names and extensions.
Create a new virtual directory, aliased as hr, under the default web site on your local machine. If you use a remote machine as the web server, change "localhost" to the host name of the web server in the value of the href attribute in the document.xml. If you use an existing virtual directory, change hr in the same href attribute value to whatever alias that directory has. Move the hrGroup.xml file to that directory.
Launch the XSLT transformation by opening it from Internet Explorer. To view the XSLT output, right click on the browser and select the View XSL Output menu item.
Output

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

<?xml version="1.0"?>
<groups>
<group name="hr">
<leader>mo</leader>
<member>bo</member>
<member>ko</member>
<member>lo</member>
</group>
<group name="my">
<leader>john</leader>
<member>jane</member>
<member>jon</member>
<member>jan</member>
</group>
</grops>
fangss 2003-04-01
  • 打赏
  • 举报
回复
多谢,这摸说是不行娄,
是不是用循环计数也不行呀?
fuchunjie 2003-04-01
  • 打赏
  • 举报
回复
XSL样式单面向的是XML文档的转换,用于显示格式的转换是其应用的一个方面,所以在显示功能上还存在着一些不足:
1.不易完成对XML数据的复杂处理,如将英文字母全部转换为大写,
截取指定长度的字符串,忽略一些特定的标点等;
2.不易对XML数据中的数值进行计算;
3. 一个XSL通常是静态地作用到一个XML文档上,
无法将多个XML文档中的数据用一个XSL合并转换为一个输出结果。
考虑使用DOM就能够很好地解决上述问题,而且编写的脚本在服务器端和客户端都能够执行。
kreven 2003-04-01
  • 打赏
  • 举报
回复
我又来了,现在比较忙,来不急帮你分析,先让他来看看吧:)

67,512

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧