我在这里找到了一个几乎完全正常运行的答案,题目是:使用Javascript代码将Cognos XML Schema文件转换为XML
Converting a Cognos XML Schema file to XML using Javascript code
我遇到的唯一问题是Filburt真棒解决方案 1.根节点似乎没有创建。 (使用Altova的XMLSpy)
当我尝试学习如何创建xslt转换时,我正在使用Altova的xmlspy。
我还注意到Congnos 10正在创建带有Spaces的XML元数据标签(xslt似乎不喜欢抛出QName错误),即First Name。当试图使用Filburt的天才代码时。
删除元数据节点中项目名称中的所有空格后,我能够正确转换文件减去顶行标记。
任何想法为什么那不起作用?
此外,我正在尝试为此构建自己的xlst文件,我唯一得到的输出是
示例XML文件
<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="Congnos2BetterXMLversionSkills.xslt"?>
<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="EmployeeName" type="xs:string" length="2414"/>
<item name="LastName" type="xs:string" length="202"/>
<item name="FirstName" type="xs:string" length="202"/>
<item name="FormerLastName" type="xs:string" length="202"/>
<item name="EmailAddress" type="xs:string" length="102"/>
<item name="Skill" type="xs:string" length="2002"/>
</metadata>
<data>
<row>
<value>Public, John</value>
<value>Public</value>
<value>John</value>
<value xs:nil="true"/>
<value>jpublic@email.com</value>
<value>Language - French</value>
</row>
</data>
</dataset>
Xslt文件。
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:template match="/">
<data>
<xsl:for-each select="/dataset/data/row">
<row>
<Employee_Name>
<xsl:value-of select="value[1]"/>
</Employee_Name>
<Last_Name>
<xsl:value-of select="value[2]"/>
</Last_Name>
<First_Name></First_Name>
<Former_Last_Name></Former_Last_Name>
<Email_Address></Email_Address>
<Skill></Skill>
</row>
</xsl:for-each>
</data>
</xsl:template>
</xsl:stylesheet>
它可能是标签中的下划线吗? 我只实施了部分内容,以确保我走在正确的轨道上。
我得到这个作为输出:
<?xml version="1.0" encoding="UTF-8"?>
<data/>
答案 0 :(得分:2)
问题在于命名空间。 Cognos XML的开头如下:
<dataset xmlns="http://developer.cognos.com/schemas/xmldata/1/" ...
这意味着dataset
元素,所有后代节点都是命名空间的一部分。但是,在XSLT中没有对此命名空间的引用,因此它正在查找没有命名空间的元素。无命名空间中的dataset
元素与属于命名空间的元素不同。
如果查看已链接的答案,您将看到样式表上如何定义名称空间前缀cog
,以及xpath表达式中的所有节点如何使用此前缀。你需要这样做。
试试这个:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:cog="http://developer.cognos.com/schemas/xmldata/1/">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:template match="/">
<data>
<xsl:for-each select="/cog:dataset/cog:data/cog:row">
<row>
<Employee_Name>
<xsl:value-of select="cog:value[1]"/>
</Employee_Name>
<Last_Name>
<xsl:value-of select="cog:value[2]"/>
</Last_Name>
<First_Name></First_Name>
<Former_Last_Name></Former_Last_Name>
<Email_Address></Email_Address>
<Skill></Skill>
</row>
</xsl:for-each>
</data>
</xsl:template>
</xsl:stylesheet>