2012-02-27 80 views
-1

我在网上发现了许多“转换器”,它们会为您执行此操作,但我一直无法找到任何可轻松实现的源代码。我想知道是否有人会为我提供建议,甚至为我提供代码,以便为我完成这项任务。我正在尝试转换为XML,因此它将更容易解析。使用Javascript代码将Cognos XML Schema文件转换为XML

我想这个转换(COGNOS XML架构)...

<?xml version="1.0" encoding="utf-8" ?> 
- <dataset xmlns="http://developer.cognos.com/schemas/xmldata/1/" xmlns:xs="http://www.w3.org/2001/XMLSchema-instance"> 
- <!-- 
<dataset 
    xmlns="http://developer.cognos.com/schemas/xmldata/1/" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema-instance" 
    xs:schemaLocation="http://developer.cognos.com/schemas/xmldata/1/ xmldata.xsd" 
> 


--> 
- <metadata> 
    <item name="ROOT_NODE_ID" type="xs:decimal" precision="38" /> 
    <item name="LEVEL1_ID" type="xs:string" length="2002" /> 
    <item name="LEVEL1_NAME" type="xs:string" length="512" /> 
    <item name="LEVEL2_ID" type="xs:string" length="2002" /> 
    <item name="LEVEL2_NAME" type="xs:string" length="512" /> 
    <item name="LEVEL3_ID" type="xs:string" length="2002" /> 
    <item name="LEVEL3_NAME" type="xs:string" length="512" /> 
    <item name="LEVEL4_ID" type="xs:string" length="2002" /> 
    <item name="LEVEL4_NAME" type="xs:string" length="512" /> 
    <item name="LEVEL5_ID" type="xs:string" length="2002" /> 
    <item name="LEVEL5_NAME" type="xs:string" length="512" /> 
    <item name="LEVEL6_ID" type="xs:string" length="2002" /> 
    <item name="LEVEL6_NAME" type="xs:string" length="512" /> 
    <item name="LEVEL7_ID" type="xs:string" length="2002" /> 
    <item name="LEVEL7_NAME" type="xs:string" length="512" /> 
    <item name="LEVEL8_ID" type="xs:string" length="2002" /> 
    <item name="LEVEL8_NAME" type="xs:string" length="512" /> 
    <item name="LEVEL9_ID" type="xs:string" length="2002" /> 
    <item name="LEVEL9_NAME" type="xs:string" length="512" /> 
    <item name="LEVEL10_ID" type="xs:string" length="2002" /> 
    <item name="LEVEL10_NAME" type="xs:string" length="512" /> 
    </metadata> 
- <data> 
- <row> 
    <value>5</value> 
    <value>5</value> 
    <value>Global Root</value> 
    <value>41</value> 
    <value>Company</value> 
    <value xs:nil="true" /> 
    <value xs:nil="true" /> 
    <value xs:nil="true" /> 
    <value xs:nil="true" /> 
    <value xs:nil="true" /> 
    <value xs:nil="true" /> 
    <value xs:nil="true" /> 
    <value xs:nil="true" /> 
    <value xs:nil="true" /> 
    <value xs:nil="true" /> 
    <value xs:nil="true" /> 
    <value xs:nil="true" /> 
    <value xs:nil="true" /> 
    <value xs:nil="true" /> 
    <value xs:nil="true" /> 
    <value xs:nil="true" /> 
    </row> 
- <row> 
    <value>5</value> 
    <value>5</value> 
    <value>Global Root</value> 
    <value>41</value> 
    <value>Company</value> 
    <value>101590</value> 
    <value>Customer</value> 
    <value>101591</value> 
    <value>Customer -All Sites</value> 
    <value>125083</value> 
    <value>Site 1</value> 
    <value xs:nil="true" /> 
    <value xs:nil="true" /> 
    <value xs:nil="true" /> 
    <value xs:nil="true" /> 
    <value xs:nil="true" /> 
    <value xs:nil="true" /> 
    <value xs:nil="true" /> 
    <value xs:nil="true" /> 
    <value xs:nil="true" /> 
    <value xs:nil="true" /> 
    </row> 
    </data> 
    </dataset> 

对此(XML)....

<?xml version="1.0" encoding="UTF-8"?> 
<rows> 
    <row> 
    <ROOT_NODE_ID>5</ROOT_NODE_ID> 
    <LEVEL1_ID>5</LEVEL1_ID> 
    <LEVEL1_NAME>Global Root</LEVEL1_NAME> 
    <LEVEL2_ID>41</LEVEL2_ID> 
    <LEVEL2_NAME>Company</LEVEL2_NAME> 
    <LEVEL3_ID></LEVEL3_ID> 
    <LEVEL3_NAME></LEVEL3_NAME> 
    <LEVEL4_ID></LEVEL4_ID> 
    <LEVEL4_NAME></LEVEL4_NAME> 
    <LEVEL5_ID></LEVEL5_ID> 
    <LEVEL5_NAME></LEVEL5_NAME> 
    <LEVEL6_ID></LEVEL6_ID> 
    <LEVEL6_NAME></LEVEL6_NAME> 
    <LEVEL7_ID></LEVEL7_ID> 
    <LEVEL7_NAME></LEVEL7_NAME> 
    <LEVEL8_ID></LEVEL8_ID> 
    <LEVEL8_NAME></LEVEL8_NAME> 
    <LEVEL9_ID></LEVEL9_ID> 
    <LEVEL9_NAME></LEVEL9_NAME> 
    <LEVEL10_ID></LEVEL10_ID> 
    <LEVEL10_NAME></LEVEL10_NAME> 
</row> 
<row> 
    <ROOT_NODE_ID>5</ROOT_NODE_ID> 
    <LEVEL1_ID>5</LEVEL1_ID> 
    <LEVEL1_NAME>Global Root</LEVEL1_NAME> 
    <LEVEL2_ID>41</LEVEL2_ID> 
    <LEVEL2_NAME>Company</LEVEL2_NAME> 
    <LEVEL3_ID>101590</LEVEL3_ID> 
    <LEVEL3_NAME>Customer</LEVEL3_NAME> 
    <LEVEL4_ID>101591</LEVEL4_ID> 
    <LEVEL4_NAME>Customer -All Sites</LEVEL4_NAME> 
    <LEVEL5_ID>125083</LEVEL5_ID> 
    <LEVEL5_NAME>Site 1</LEVEL5_NAME> 
    <LEVEL6_ID></LEVEL6_ID> 
    <LEVEL6_NAME></LEVEL6_NAME> 
    <LEVEL7_ID></LEVEL7_ID> 
    <LEVEL7_NAME></LEVEL7_NAME> 
    <LEVEL8_ID></LEVEL8_ID> 
    <LEVEL8_NAME></LEVEL8_NAME> 
    <LEVEL9_ID></LEVEL9_ID> 
    <LEVEL9_NAME></LEVEL9_NAME> 
    <LEVEL10_ID></LEVEL10_ID> 
    <LEVEL10_NAME></LEVEL10_NAME> 
    </row> 
</rows> 
+1

您到目前为止尝试过什么?为什么你需要Javascript来解决这个问题,而不是服务器端技术。我认为这个问题需要更多关于你尝试过的细节,以及为什么你被困住了。 – Zoidberg 2012-02-27 13:25:50

+0

试图用JS解决这个问题将会让你无处可寻。如果你想从默认的Cognos Xml报表转换到你想要的Xml结构,你可以通过Xslt来完成。我已经这样做了,但是由于我转向使用SDK中的Webservice,需要一些时间来查找示例代码。如果您可以使用Cognos SDK(即,如果您花费了额外的成本并购买了它),我也可以提供一个示例。 – Filburt 2012-02-27 13:40:08

+0

谢谢Filburt,我很想看你的示例代码。而且我有SDK,但据我所知,这只适用于Java和C#?我需要这样做,因为我正在JavaScript中重新创建Cognos树对象,然后我将在Cognos报告中实现一个HTML对象。我的BI团队已经指定了我,因为我们的树节点列表很长,Cognos树对象不再适用于我们。但我期待您的样片代码! – Zack 2012-02-27 13:46:46

回答

0

这XSLT剥去任意COGNOS任何模式元报告 - Xml输出方法 - 并创建从元数据中提取名称的结果元素:

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet version="1.0" xmlns="http://tempuri.org/" xmlns:cog="http://developer.cognos.com/schemas/xmldata/1/" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" indent="yes" /> 

    <xsl:template match="//comment()" /> 

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

    <xsl:template match="cog:dataset"> 
     <rows> 
      <xsl:apply-templates /> 
     </rows> 
    </xsl:template> 

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

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

    <xsl:template match="@name | @type | @length | @precision" /> 

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

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

    <xsl:template match="cog:value"> 
     <xsl:variable name="currentposition" select="count(./preceding-sibling::cog:value)+1" /> 
     <xsl:variable name="currentname" select="//cog:metadata/cog:item[$currentposition]/@name" /> 
     <xsl:element name="{$currentname}"> 
      <xsl:apply-templates /> 
     </xsl:element> 
    </xsl:template> 

    <xsl:template match="@* | node()"> 
     <xsl:copy> 
      <xsl:apply-templates select="@* | node()"/> 
     </xsl:copy> 
    </xsl:template> 
</xsl:stylesheet> 

如果您想要使Cognos应用服务器端转换,则必须选择输出方法,这将使转换更容易一些,因为每个字段都将带有其实际名称而不是