新书推介:《语义网技术体系》
作者:瞿裕忠,胡伟,程龚
   XML论坛     W3CHINA.ORG讨论区     计算机科学论坛     SOAChina论坛     Blog     开放翻译计划     新浪微博  
 
  • 首页
  • 登录
  • 注册
  • 软件下载
  • 资料下载
  • 核心成员
  • 帮助
  •   Add to Google

    >> 本版讨论XSL,XSLT,XSL-FO,CSS等技术
    [返回] 中文XML论坛 - 专业的XML技术讨论区XML.ORG.CN讨论区 - XML技术『 XSL/XSLT/XSL-FO/CSS 』 → 烦恼 数据库中查询出的内容重新组织为新的XML文档 请各位大侠帮忙。感激不尽! 查看新帖用户列表

      发表一个新主题  发表一个新投票  回复主题  (订阅本版) 您是本帖的第 10540 个阅读者浏览上一篇主题  刷新本主题   树形显示贴子 浏览下一篇主题
     * 贴子主题: 烦恼 数据库中查询出的内容重新组织为新的XML文档 请各位大侠帮忙。感激不尽! 举报  打印  推荐  IE收藏夹 
       本主题类别: 样式表技术(XSL, XSLT, XSL-FO, CSS)    
     guduke 帅哥哟,离线,有人找我吗?
      
      
      等级:大一(猛啃高等数学)
      文章:18
      积分:155
      门派:XML.ORG.CN
      注册:2010/5/11

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给guduke发送一个短消息 把guduke加入好友 查看guduke的个人资料 搜索guduke在『 XSL/XSLT/XSL-FO/CSS 』的所有贴子 引用回复这个贴子 回复这个贴子 查看guduke的博客楼主
    发贴心情 烦恼 数据库中查询出的内容重新组织为新的XML文档 请各位大侠帮忙。感激不尽!

    有个问题想请教各位,
    我有一些内容存在数据库中,一次查询可以查询出N条SQL记录。


    我要处理的内容被存在查询出每条记录的 ModelID 和Field 字段中。

    其中查询的内容可以
    <xsl:value-of select="/NewDataSet/Table/ModelID"/>
    <xsl:value-of select="/NewDataSet/Table/Field"/>
    显示

    其中ModelID中为整数数字 Field中为xml文档 文档的格式如下:
    <?xml version="1.0" encoding="utf-16"?>
    <ArrayOfFieldInfo>
    ...
    <FieldInfo Id="edition" Disabled="false" OrderId="5">
        <FieldName>Version</FieldName>
        <EnableShowOnSearchForm>true</EnableShowOnSearchForm>
        <EnableFilter>false</EnableFilter>
        <FieldAlias>教材版本</FieldAlias>
        <FieldLevel>1</FieldLevel>
        <Tips />
        <Description />
        <FieldType>ListBoxType</FieldType>
        <Settings>
          <string>语文版|1$$$苏教版|2$$$鄂教版|3</string>
          <string>1</string>
          <string>False</string>
          <string>1</string>
        </Settings>
        <EnableNull>false</EnableNull>
        <DefaultValue />
      </FieldInfo>
    ...
    </ArrayOfFieldInfo>

    我需要将这个文档中的ArrayOfFieldInfo/FieldInfo[@Id='edition']/Settings/string[1] 的内容取出(也就是 语文版|1$$$苏教版|2$$$鄂教版|3)具体内容不定,可能

    有更多或更少。按如下的格式组织成一个新的XML文档。
    <CATALOG>
    <edition category="102">
    <item>
      <name>苏教版</name>
      <id>5</id>
      </item>
    <item>
      <name>苏科版</name>
      <id>1</id>
      </item>
    </edition>
    <edition category="103">
    <item>
      <name>苏教版103</name>
      <id>1</id>
      </item>
    <item>
      <name>苏科版103</name>
      <id>2</id>
      </item>
      </edition>
    <edition category="104">
    <item>
      <name>苏教版104</name>
      <id>1</id>
      </item>
    <item>
      <name>苏科版104</name>
      <id>2</id>
      </item>
    </edition>
    </CATALOG>

    其中category="102" 102 为ModelID的值(具体值随着数据库里查询的内容变化),每一个
    <edition category="102">
    <item>
      <name>苏教版</name>
      <id>5</id>
      </item>
    <item>
      <name>苏科版</name>
      <id>1</id>
      </item>
    </edition>
    对应一条SQL查询记录 也就是对应一个field中的msxsl:node-set($Array)/ArrayOfFieldInfo/FieldInfo[@Id='edition']/Settings/string[1]的字符串。
    每一个item节点对应 一个$$$分段 这样语文版|15$$$苏教版|12$$$鄂教版|1就有三个分段 也就有三个item节点 name 节点为"|"前的值 id 为"|"后的值

    也就是最后的XML文档需要用for-each 或迭代循环每条记录合成最后

    <CATALOG>
    <edition category="102">第一条记录节点
    ...
    </edition>
    <edition category="103">...
    ...
      </edition>
    <edition category="104">第N条记录节点
    ....
    </edition>
    </CATALOG>

    以下是我自己的思考,可以不看!--------------------------------我按如下:

    <?xml version="1.0" encoding="utf-8"?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt" xmlns:pe="labelproc"

    exclude-result-prefixes="pe">
    <xsl:output method="html" />
    <xsl:template match="/">
        <xsl:variable name="Array">
           <xsl:value-of  select="/NewDataSet/Table/Field"/>


        </xsl:variable>


    <xsl:value-of select="$Array"/>
    就无法获得内容

    但是

       <xsl:variable name="Array">
          

    <ArrayOfFieldInfo>
    <FieldInfo Id="version" Disabled="false" OrderId="5">
        <FieldName>Version</FieldName>
        <EnableShowOnSearchForm>true</EnableShowOnSearchForm>
        <EnableFilter>false</EnableFilter>
        <FieldAlias>教材版本</FieldAlias>
        <FieldLevel>1</FieldLevel>
        <Tips />
        <Description />
        <FieldType>ListBoxType</FieldType>
        <Settings>
          <string>语文版|1$$$苏教版|2$$$鄂教版|3</string>
          <string>1</string>
          <string>False</string>
          <string>1</string>
        </Settings>
        <EnableNull>false</EnableNull>
        <DefaultValue />
      </FieldInfo>
    </ArrayOfFieldInfo>
        </xsl:variable>

    这样
    <xsl:value-of select="$Array"/>
    就能显示:语文版|1$$$苏教版|2$$$鄂教版|3

    但是如果直接 <xsl:value-of  select="/NewDataSet/Table/Field"/>也是可以显示值的。
    不晓得为什么?


    最终如何能组织成为最后的xml还请各位老大帮个忙。烦恼了多日了。谢谢!感激不尽


       收藏   分享  
    顶(0)
      




    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2010/5/16 0:22:00
     
     jj_long 帅哥哟,离线,有人找我吗?
      
      
      威望:1
      等级:大三(面向对象是个好东东!)
      文章:42
      积分:574
      门派:XML.ORG.CN
      注册:2008/7/29

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给jj_long发送一个短消息 把jj_long加入好友 查看jj_long的个人资料 搜索jj_long在『 XSL/XSLT/XSL-FO/CSS 』的所有贴子 引用回复这个贴子 回复这个贴子 查看jj_long的博客2
    发贴心情 
    楼主没有把输入数据的格式交代清楚。我试着按照描述给出一个输入数据,试着提供一个XSLT,希望能对楼主有些帮助。

    1. 输入数据格式:
    ==================================================
    <?xml version="1.0" encoding="utf-8"?>

    <NewDataSet>
     <table>
      <ModelID>102</ModelID>
      <Field>
       <ArrayOfFieldInfo>
        <FieldInfo Id="edition" Disabled="false" OrderId="5">
         <FieldName>Version</FieldName>
         <EnableShowOnSearchForm>true</EnableShowOnSearchForm>
         <EnableFilter>false</EnableFilter>
         <FieldAlias>教材版本</FieldAlias>
         <FieldLevel>1</FieldLevel>
         <Tips />
         <Description />
         <FieldType>ListBoxType</FieldType>
         <Settings>
          <string>语文版a|1$$$苏教版a|2$$$鄂教版a|3</string>
          <string>1</string>
          <string>False</string>
          <string>1</string>
         </Settings>
         <EnableNull>false</EnableNull>
         <DefaultValue />
        </FieldInfo>
       </ArrayOfFieldInfo>

      </Field>
     </table>
     
     <table>
      <ModelID>103</ModelID>
      <Field>
       <ArrayOfFieldInfo>
        <FieldInfo Id="edition" Disabled="false" OrderId="5">
         <FieldName>Version</FieldName>
         <EnableShowOnSearchForm>true</EnableShowOnSearchForm>
         <EnableFilter>false</EnableFilter>
         <FieldAlias>教材版本</FieldAlias>
         <FieldLevel>1</FieldLevel>
         <Tips />
         <Description />
         <FieldType>ListBoxType</FieldType>
         <Settings>
          <string>语文版b|1$$$苏教版b|2$$$鄂教版b|3</string>
          <string>1</string>
          <string>False</string>
          <string>1</string>
         </Settings>
         <EnableNull>false</EnableNull>
         <DefaultValue />
        </FieldInfo>
       </ArrayOfFieldInfo>

      </Field>
     </table>
     
     <table>
      <ModelID>104</ModelID>
      <Field>
       <ArrayOfFieldInfo>
        <FieldInfo Id="edition" Disabled="false" OrderId="5">
         <FieldName>Version</FieldName>
         <EnableShowOnSearchForm>true</EnableShowOnSearchForm>
         <EnableFilter>false</EnableFilter>
         <FieldAlias>教材版本</FieldAlias>
         <FieldLevel>1</FieldLevel>
         <Tips />
         <Description />
         <FieldType>ListBoxType</FieldType>
         <Settings>
          <string>语文版c|1$$$苏教版c|2$$$鄂教版c|3</string>
          <string>1</string>
          <string>False</string>
          <string>1</string>
         </Settings>
         <EnableNull>false</EnableNull>
         <DefaultValue />
        </FieldInfo>
       </ArrayOfFieldInfo>

      </Field>
     </table>
    </NewDataSet>
    ==================================================


    2.XSLT
    ==================================================
    <?xml version='1.0'?>

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

    <xsl:output method="xml" indent="yes"/>

    <xsl:template match="/">
     <CATALOG>
      <xsl:apply-templates/>
     </CATALOG>
    </xsl:template>

    <xsl:template match="table">
     <edition category="{ModelID}">
      <xsl:apply-templates select="Field/ArrayOfFieldInfo/FieldInfo/Settings/string[1]"/>  
     </edition>
    </xsl:template>

    <xsl:template match="Settings/string">
     <xsl:variable name="v_content" select="."/>
     
     <xsl:call-template name="f-output-item">
      <xsl:with-param name="p_content" select="$v_content"/>
     </xsl:call-template>
    </xsl:template>

    <xsl:template name="f-output-item">
     <xsl:param name="p_content"/>
     
     <xsl:if test="normalize-space($p_content) != ''">
      
      <xsl:choose>
       <xsl:when test="contains($p_content,'$$$')">
        <xsl:variable name="v_sub_content1" select="substring-before($p_content,'$$$')"/>
        <xsl:variable name="v_sub_content2" select="substring-after($p_content,'$$$')"/>
        
        <item>
         <name><xsl:value-of select="substring-before($v_sub_content1,'|')"/></name>
         <id><xsl:value-of select="substring-after($v_sub_content1,'|')"/></id>
        </item> 
        
        <xsl:call-template name="f-output-item">
         <xsl:with-param name="p_content" select="$v_sub_content2"/>
        </xsl:call-template>
       </xsl:when>
       <xsl:otherwise>
        <item>
         <name><xsl:value-of select="substring-before($p_content,'|')"/></name>
         <id><xsl:value-of select="substring-after($p_content,'|')"/></id>
        </item> 
       </xsl:otherwise>
      </xsl:choose>
       
     </xsl:if>
     
    </xsl:template>

    </xsl:stylesheet>

    ==================================================

    3. 输出结果
    ==================================================
    <?xml version="1.0" encoding="utf-8"?>
    <CATALOG>
     
       <edition category="102">
          <item>
             <name>语文版a</name>
             <id>1</id>
          </item>
          <item>
             <name>苏教版a</name>
             <id>2</id>
          </item>
          <item>
             <name>鄂教版a</name>
             <id>3</id>
          </item>
       </edition>
     
     
       <edition category="103">
          <item>
             <name>语文版b</name>
             <id>1</id>
          </item>
          <item>
             <name>苏教版b</name>
             <id>2</id>
          </item>
          <item>
             <name>鄂教版b</name>
             <id>3</id>
          </item>
       </edition>
     
     
       <edition category="104">
          <item>
             <name>语文版c</name>
             <id>1</id>
          </item>
          <item>
             <name>苏教版c</name>
             <id>2</id>
          </item>
          <item>
             <name>鄂教版c</name>
             <id>3</id>
          </item>
       </edition>

    </CATALOG>
    ==================================================


    注:
        我使用了Saxon 6.5调试此程序。

    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2010/5/16 20:38:00
     
     guduke 帅哥哟,离线,有人找我吗?
      
      
      等级:大一(猛啃高等数学)
      文章:18
      积分:155
      门派:XML.ORG.CN
      注册:2010/5/11

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给guduke发送一个短消息 把guduke加入好友 查看guduke的个人资料 搜索guduke在『 XSL/XSLT/XSL-FO/CSS 』的所有贴子 引用回复这个贴子 回复这个贴子 查看guduke的博客3
    发贴心情 
    编辑掉。这个表达错了!
    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2010/5/16 23:51:00
     
     guduke 帅哥哟,离线,有人找我吗?
      
      
      等级:大一(猛啃高等数学)
      文章:18
      积分:155
      门派:XML.ORG.CN
      注册:2010/5/11

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给guduke发送一个短消息 把guduke加入好友 查看guduke的个人资料 搜索guduke在『 XSL/XSLT/XSL-FO/CSS 』的所有贴子 引用回复这个贴子 回复这个贴子 查看guduke的博客4
    发贴心情 
    对不起 上面的意思表达错了。
    文件结构如下

    1. 输入数据格式:
    ==================================================
    <?xml version="1.0" encoding="utf-8"?>

    <NewDataSet>
    <table>
      <ModelID>102</ModelID>
      <Field>
    <?xml version="1.0" encoding="utf-16"?>

    <ArrayOfFieldInfo>
    ...
    <FieldInfo Id="edition" Disabled="false" OrderId="5">
        <FieldName>Version</FieldName>
        <EnableShowOnSearchForm>true</EnableShowOnSearchForm>
        <EnableFilter>false</EnableFilter>
        <FieldAlias>教材版本</FieldAlias>
        <FieldLevel>1</FieldLevel>
        <Tips />
        <Description />
        <FieldType>ListBoxType</FieldType>
        <Settings>
          <string>语文版|1$$$苏教版|2$$$鄂教版|3</string>
          <string>1</string>
          <string>False</string>
          <string>1</string>
        </Settings>
        <EnableNull>false</EnableNull>
        <DefaultValue />
      </FieldInfo>


    <FieldInfo Id="ttt" Disabled="false" OrderId="5">
        <FieldName>Version</FieldName>
        <EnableShowOnSearchForm>true</EnableShowOnSearchForm>
        <EnableFilter>false</EnableFilter>
        <FieldAlias>教材版本</FieldAlias>
        <FieldLevel>1</FieldLevel>
        <Tips />
        <Description />
        <FieldType>ListBoxType</FieldType>
        <Settings>
          <string>语文版|1$$$苏教版|2$$$鄂教版|3</string>
          <string>1</string>
          <string>False</string>
          <string>1</string>
        </Settings>
        <EnableNull>false</EnableNull>
        <DefaultValue />
      </FieldInfo>

    ... (这个地方时上面的重复。)下面的field依次是这样 主要有<?xml version="1.0" encoding="utf-16"?>不碍事吧!
    </ArrayOfFieldInfo>

      </Field>
    </table>

    <table>
      <ModelID>103</ModelID>
      <Field>
       <ArrayOfFieldInfo>
        <FieldInfo Id="edition" Disabled="false" OrderId="5">
         <FieldName>Version</FieldName>
         <EnableShowOnSearchForm>true</EnableShowOnSearchForm>
         <EnableFilter>false</EnableFilter>
         <FieldAlias>教材版本</FieldAlias>
         <FieldLevel>1</FieldLevel>
         <Tips />
         <Description />
         <FieldType>ListBoxType</FieldType>
         <Settings>
          <string>语文版b|1$$$苏教版b|2$$$鄂教版b|3</string>
          <string>1</string>
          <string>False</string>
          <string>1</string>
         </Settings>
         <EnableNull>false</EnableNull>
         <DefaultValue />
        </FieldInfo>
       </ArrayOfFieldInfo>

      </Field>
    </table>

    <table>
      <ModelID>104</ModelID>
      <Field>
       <ArrayOfFieldInfo>
        <FieldInfo Id="edition" Disabled="false" OrderId="5">
         <FieldName>Version</FieldName>
         <EnableShowOnSearchForm>true</EnableShowOnSearchForm>
         <EnableFilter>false</EnableFilter>
         <FieldAlias>教材版本</FieldAlias>
         <FieldLevel>1</FieldLevel>
         <Tips />
         <Description />
         <FieldType>ListBoxType</FieldType>
         <Settings>
          <string>语文版c|1$$$苏教版c|2$$$鄂教版c|3</string>
          <string>1</string>
          <string>False</string>
          <string>1</string>
         </Settings>
         <EnableNull>false</EnableNull>
         <DefaultValue />
        </FieldInfo>
       </ArrayOfFieldInfo>

      </Field>
    </table>
    </NewDataSet>
    ==================================================

    即field内部是一个xml文档。要取得field 中filed/ArrayOfFieldInfo/FieldInfo[@Id='version']/Settings/string[1]"/
    field中是xml格式的文档路径也是这样写吗?多谢!

    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2010/5/17 0:19:00
     
     jj_long 帅哥哟,离线,有人找我吗?
      
      
      威望:1
      等级:大三(面向对象是个好东东!)
      文章:42
      积分:574
      门派:XML.ORG.CN
      注册:2008/7/29

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给jj_long发送一个短消息 把jj_long加入好友 查看jj_long的个人资料 搜索jj_long在『 XSL/XSLT/XSL-FO/CSS 』的所有贴子 引用回复这个贴子 回复这个贴子 查看jj_long的博客5
    发贴心情 
    1.XML里边再有<?xml version="1.0" encoding="utf-16"?>不合法,这句必须出现在XML的第一句。

    2. Q&A
    Q: 即field内部是一个xml文档。要取得field 中filed/ArrayOfFieldInfo/FieldInfo[@Id='version']/Settings/string[1]"/
    field中是xml格式的文档路径也是这样写吗?多谢!

    A: 是的。

    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2010/5/17 9:25:00
     
     guduke 帅哥哟,离线,有人找我吗?
      
      
      等级:大一(猛啃高等数学)
      文章:18
      积分:155
      门派:XML.ORG.CN
      注册:2010/5/11

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给guduke发送一个短消息 把guduke加入好友 查看guduke的个人资料 搜索guduke在『 XSL/XSLT/XSL-FO/CSS 』的所有贴子 引用回复这个贴子 回复这个贴子 查看guduke的博客6
    发贴心情 
    XML里边再有<?xml version="1.0" encoding="utf-16"?>不合法,

    即Field 里面就是一个XML文档 我也没办法控制 <?xml version="1.0" encoding="utf-16"?> 没有。而且一定会有这么一句的。那请问如何通过变通的方式才能使得正常运行下来啊!。也就是取得string节点值呢。这个是从数据表中查询出来的。没办法控制那句不出现。
    谢谢!


    [此贴子已经被作者于2010-5-17 11:11:05编辑过]
    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2010/5/17 10:31:00
     
     jj_long 帅哥哟,离线,有人找我吗?
      
      
      威望:1
      等级:大三(面向对象是个好东东!)
      文章:42
      积分:574
      门派:XML.ORG.CN
      注册:2008/7/29

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给jj_long发送一个短消息 把jj_long加入好友 查看jj_long的个人资料 搜索jj_long在『 XSL/XSLT/XSL-FO/CSS 』的所有贴子 引用回复这个贴子 回复这个贴子 查看jj_long的博客7
    发贴心情 
    如果你的XML不合法,XML解析器是不能解析这个XML并使用XSLT。这样就不是一个XSLT的问题而是你程序架构的问题。

    你需要想办法让你的XML合法。

    考虑解决办法的优先级:
    1. 调整你从数据库取数据的程序,让它输出合法的XML文档。如果无法通过此途径, 则:
    2. 考虑编写一个程序,处理一下这个出来的文件,让他变成合法的XML,然后运行XSLT。

    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2010/5/18 17:55:00
     
     guduke 帅哥哟,离线,有人找我吗?
      
      
      等级:大一(猛啃高等数学)
      文章:18
      积分:155
      门派:XML.ORG.CN
      注册:2010/5/11

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给guduke发送一个短消息 把guduke加入好友 查看guduke的个人资料 搜索guduke在『 XSL/XSLT/XSL-FO/CSS 』的所有贴子 引用回复这个贴子 回复这个贴子 查看guduke的博客8
    发贴心情 
    感谢你给我写的XSLT,我变通的一下运用起来了,非常感谢你的帮助。谢谢!
    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2010/5/19 16:17:00
     
     GoogleAdSense
      
      
      等级:大一新生
      文章:1
      积分:50
      门派:无门无派
      院校:未填写
      注册:2007-01-01
    给Google AdSense发送一个短消息 把Google AdSense加入好友 查看Google AdSense的个人资料 搜索Google AdSense在『 XSL/XSLT/XSL-FO/CSS 』的所有贴子 访问Google AdSense的主页 引用回复这个贴子 回复这个贴子 查看Google AdSense的博客广告
    2024/5/3 6:55:20

    本主题贴数8,分页: [1]

    管理选项修改tag | 锁定 | 解锁 | 提升 | 删除 | 移动 | 固顶 | 总固顶 | 奖励 | 惩罚 | 发布公告
    W3C Contributing Supporter! W 3 C h i n a ( since 2003 ) 旗 下 站 点
    苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
    111.328ms