XSLT求助:XML格式转换,没玩过,求指点

shoppo0505 2017-07-19 08:38:21
实例的操作是,将最终节点中的所有attribut的名称和值转换成节点。源文件和目标文件的格式如下:

XML源文件格式如下:
<xml 描述..... >
<Root>
<Page ....>
<SubPage1>
<Node1 a1='x1' b1='y1', c1='z1' ........................................../>
<Node2 aa1='xx1' bb1='yy1', cc1='zz1' ........................................../>
<Node3 aaa='xxx1' bbb='yyy1', ccc1='zzz1' ........................................../>
</SubPage1>
<SubPage2>
<Node1 a2='x2' b2='y2', c2='z2' ........................................../>
<Node2 aa2='xx2' bb2='yy2', cc2='zz2' ........................................../>
<Node3 aaa2='xxx2' bbb2='yyy2', ccc2='zzz2' ........................................../>
</SubPage2>
......
</Page>
</Root>
需要转换成
<xml 描述..... >
<Node name='a1'>
<value> x1<value>
</Node>
<Node name='b1'>
<value> y1<value>
</Node>
<Node name='c1'>
<value> z1<value>
</Node>
<Node name='aa1'>
<value> xx1<value>
</Node>
......

<Node name='a2'>
<value> x2<value>
</Node>
<Node name='b2'>
<value> y2<value>
</Node>
<Node name='c2'>
<value> z2<value>
</Node>
<Node name='aa2'>
<value> xx2<value>
</Node>
......

<Node name='a3'>
<value> x3<value>
</Node>
<Node name='b3'>
<value> y3<value>
</Node>
<Node name='c3'>
<value> z3<value>
</Node>
<Node name='aa3'>
<value> xx3<value>
</Node>
......

网上看过很多例子,但是这个实例的问题是,所有节点以及所有节点中间attribut的名称都是不一样的,只是最后转换成如下格式
<Node name='attribut的名称'>
<value> attribut的值<value>
</Node>
根据网上的例子也弄不出来,请高人指教。

比较急,如果能帮忙弄出来,再给200分。

...全文
1436 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
shoppo0505 2017-09-20
  • 打赏
  • 举报
回复
不管对错,结贴了。
旅行商 2017-09-18
  • 打赏
  • 举报
回复
按楼主的要求,写了个xsl对xml进行了相应的转换。其实这个问题相当简单:定义模板,匹配模板,循环遍历要处理的节点集,再对节点集中的每个节点进行属性集的遍历,即可得到结果。(注意:为了便于在浏览器中显示出转换的结果,对结果的输出元素进行了实体转换,否则浏览器中是看不到结果的。真正工和作的代码是注释掉的那段,请自行替换。) test.xml

<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="test.xsl"?>
<Root>
    <Page>
      <SubPage1>
        <Node1  a1='x1' b1='y1' c1='z1' />
        <Node2  aa1='xx1' bb1='yy1' cc1='zz1' />
        <Node3  aaa='xxx1' bbb='yyy1' ccc1='zzz1' />
     </SubPage1>
      <SubPage2>
        <Node1  a2='x2' b2='y2' c2='z2' />
        <Node2  aa2='xx2' bb2='yy2' cc2='zz2' />
        <Node3  aaa2='xxx2' bbb2='yyy2' ccc2='zzz2' />
     </SubPage2>
    </Page>
</Root>
test.xsl

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="html" encoding="utf-8" indent="yes" />
    <xsl:template match="/Root/Page">
        <xsl:apply-templates select="*" mode="SubPage" />
    </xsl:template>

    <xsl:template match="*" mode="SubPage">
        <xsl:apply-templates select="*" mode="Node" />
    </xsl:template>

    <xsl:template match="*" mode="Node">
        <xsl:call-template name="node" />
    </xsl:template>

    <xsl:template name="node">
        <!-- 用于浏览器中演示的模板 -->
        <xsl:for-each select="@*">
            <Node name="<xsl:value-of select='name()' />"><br />
                <xsl:text>    </xsl:text>
                <value><xsl:value-of select="." /></value><br />
            </Node><br />
        </xsl:for-each>

        <!-- 正式模板 -->
        <!--
        <xsl:for-each select="@*">
            <Node name="name()">
                <value><xsl:value-of select="." /></value>
            </Node>
        </xsl:for-each>
        -->
    </xsl:template>
</xsl:stylesheet>
可直接在浏览器中访问 test.xml 即可看到转换结果。
shoppo0505 2017-09-13
  • 打赏
  • 举报
回复
没人回帖,想结贴都不行啊。
shoppo0505 2017-07-27
  • 打赏
  • 举报
回复
没人回帖,想结贴都不行啊。
shoppo0505 2017-07-19
  • 打赏
  • 举报
回复
再补充2点,所有节点,和节点中间的attribut个数都是不同的。在Node以上的节点中,有个也有Attribut,但是这些不需要解析。 只需要解析Node节点中的attribut。

8,906

社区成员

发帖
与我相关
我的任务
社区描述
XML/XSL相关问题讨论专区
社区管理员
  • XML/XSL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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