【问题标题】:Converting Congnos 10 XML Data via XSLT to an easier to loop through XML File通过 XSLT 将 Congnos 10 XML 数据转换为更容易循环的 XML 文件
【发布时间】:2025-12-02 10:05:03
【问题描述】:

我在这里找到了一个功能齐全的答案,标题为:Converting a Cognos XML Schema file to XML using Javascript code

Converting a Cognos XML Schema file to XML using Javascript code

我对 Filburt 的出色解决方案的唯一问题是 1. 似乎没有创建根节点。 (使用 Altova 的 XMLSpy)

当我尝试学习如何创建 xslt 转换时,我正在使用 Altova 的 xmlspy。

我还注意到 Congnos 10 正在创建带有空格的 XML 元数据标签(xslt 似乎不喜欢抛出 QName 错误),即名字。尝试使用 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/>

【问题讨论】:

    标签: xml xslt cognos cognos-10


    【解决方案1】:

    问题在于命名空间。 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>
    

    【讨论】:

    • 好的,Tim C 这确实有效,它必须是 Cog:在所有这些地方,还是你可以这样做? w3.org/1999/XSL/Transform">
    • 在 XSLT 1.0 中,您必须在每个 xpath 表达式前面加上 cog:。在 XSLT 2.0 中,您可以使用 xpath-default-namespace 选项。