2012-02-27 65 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應用服務器端轉換,則必須選擇輸出方法,這將使轉換更容易一些,因爲每個字段都將帶有其實際名稱而不是