以文本方式查看主题

-  中文XML论坛 - 专业的XML技术讨论区  (http://bbs.xml.org.cn/index.asp)
--  『 XSL/XSLT/XSL-FO/CSS 』  (http://bbs.xml.org.cn/list.asp?boardid=8)
----  烦恼 数据库中查询出的内容重新组织为新的XML文档 请各位大侠帮忙。感激不尽!  (http://bbs.xml.org.cn/dispbbs.asp?boardid=8&rootid=&id=84784)


--  作者:guduke
--  发布时间:5/16/2010 12:22:00 AM

--  烦恼 数据库中查询出的内容重新组织为新的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还请各位老大帮个忙。烦恼了多日了。谢谢!感激不尽


--  作者:jj_long
--  发布时间:5/16/2010 8:38:00 PM

--  
楼主没有把输入数据的格式交代清楚。我试着按照描述给出一个输入数据,试着提供一个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调试此程序。


--  作者:guduke
--  发布时间:5/16/2010 11:51:00 PM

--  
编辑掉。这个表达错了!
--  作者:guduke
--  发布时间:5/17/2010 12:19:00 AM

--  
对不起 上面的意思表达错了。
文件结构如下

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格式的文档路径也是这样写吗?多谢!


--  作者:jj_long
--  发布时间:5/17/2010 9:25:00 AM

--  
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: 是的。


--  作者:guduke
--  发布时间:5/17/2010 10:31:00 AM

--  
XML里边再有<?xml version="1.0" encoding="utf-16"?>不合法,

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


[此贴子已经被作者于2010-5-17 11:11:05编辑过]

--  作者:jj_long
--  发布时间:5/18/2010 5:55:00 PM

--  
如果你的XML不合法,XML解析器是不能解析这个XML并使用XSLT。这样就不是一个XSLT的问题而是你程序架构的问题。

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

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


--  作者:guduke
--  发布时间:5/19/2010 4:17:00 PM

--  
感谢你给我写的XSLT,我变通的一下运用起来了,非常感谢你的帮助。谢谢!
W 3 C h i n a ( since 2003 ) 旗 下 站 点
苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
109.375ms