1

ここで、ほぼ完全に機能する答えを見つけました: Converting a Cognos XML Schema file to XML using Javascript code

Javascript コードを使用して Cognos XML スキーマ ファイルを XML に変換する

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/>
4

1 に答える 1

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>
于 2014-09-19T08:10:50.497 に答える