1

SQLServer から XML が出ています。ノードの名前を条件付きで変更できる SQLServer を取得できなかったので、後で XSLT を使用して変更します。XSLT で何をしているのかよくわかりません。StackOverFlow で検索して見つけたものからソリューションをまとめました。私が抱えている問題は、入力に子がない (したがってタグが 1 つしかない) タグが展開され、変換後に開始タグと終了タグを持つことです。帯域幅が問題になるユーザーが十分にいるので、これを防ぎたいと思います。

入力は次のとおりです。

<評価データ>
    <コントロール>
        <questRequiredOverride>N</questRequiredOverride>
    </コントロール>
    <パス>
        <path id="SJ">
            <questionFile timeScreen="" timeEstimate="0">SJ-CVS-Section-Mgt</questionFile>
            <questionFile timeScreen="SitJudge" timeEstimate="5">SJ-CVS-Mgt</questionFile>
            <questionFile timeScreen="SitJudge" timeEstimate="5">SJ-CVS-Mgt-SS</questionFile>
            <シーケンス>
                <グループ>
                    <content_block presentation="SituationalJudgmentInstructions"
                        type="指示">
                        <質問>
                            <question id="sjex"/>
                        </質問>
                    </content_block>
                    <content_block presentation="SituationalJudgmentQuestions" type="演習"
                        パス="1">
                        <質問>
                            <question id="sj6_Mgt"/>
                            <question id="sj7_Mgt"/>
                        </質問>
                    </content_block>
                    <content_block presentation="SituationalJudgmentQuestions" type="演習"
                        パス="2">
                        <質問>
                            <question id="sj13_SS"/>
                            <question id="sj12_SS"/>
                            <question id="sj10_SS"/>
                            <question id="sj8_SS"/>
                            <質問ID="sj5_SS"/>
                            <質問ID="sj3_SS"/>
                        </質問>
                    </content_block>
                    <content_block presentation="休憩" type="休憩"/>
                </グループ>
            </シーケンス>
        </パス>
...
        <path id="スコアリング">
            <シーケンス>
                <グループ>
                    <content_block presentation="Scoring" type="scoring"/>
                </グループ>
            </シーケンス>
        </パス>
        <path id="フィードバック">
            <questionFile timeScreen="" timeEstimate="0">フィードバック-CVS</questionFile>
            <シーケンス>
                <グループ>
                    <content_block presentation="フィードバック" type="演習" path="1">
                        <質問>
                            <質問ID="fb30"/>
                            <質問ID="fb32"/>
                            <質問ID="fb40"/>
                            <質問ID="fb50"/>
                        </質問>
                    </content_block>
                </グループ>
            </シーケンス>
        </パス>
    </パス>
</評価データ>

XSLT は

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    バージョン="1.0">
    <xsl:output indent="yes"/>
    <xsl:strip-space elements="*"/>
    <xsl:template match="content_block">
        <xsl:要素名="{@type}">
        <xsl:apply-templates select="@*|node()"></xsl:apply-templates>
        </xsl:要素>
    </xsl:テンプレート>
    <xsl:template match="@*|node()">
        <xsl:コピー>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:コピー>
    </xsl:テンプレート>
</xsl:スタイルシート>

...出力は次のとおりです。

<評価データ>
    <コントロール>
        <questRequiredOverride>N</questRequiredOverride>
    </コントロール>
    <パス>
        <path id="SJ">
            <questionFile timeScreen="" timeEstimate="0">SJ-CVS-Section-Mgt</questionFile>
            <questionFile timeScreen="SitJudge" timeEstimate="5">SJ-CVS-Mgt</questionFile>
            <questionFile timeScreen="SitJudge" timeEstimate="5">SJ-CVS-Mgt-SS</questionFile>
            <シーケンス>
                <グループ>
                    <instructions presentation="SituationalJudgmentInstructions" type="instructions">
                        <質問>
                            <question id="sjex"> </question>
                        </質問>
                    </指示>
                    <exercise presentation="SituationalJudgmentQuestions" type="exercise" path="1">
                        <質問>
                            <question id="sj6_Mgt"> </question>
                            <question id="sj7_Mgt"> </question>
                        </質問>
                    </演習>
                    <exercise presentation="SituationalJudgmentQuestions" type="exercise" path="2">
                        <質問>
                            <question id="sj13_SS"> </question>
                            <question id="sj12_SS"> </question>
                            <question id="sj10_SS"> </question>
                            <question id="sj8_SS"> </question>
                            <question id="sj5_SS"> </question>
                            <question id="sj3_SS"> </question>
                        </質問>
                    </演習>
                    <休憩プレゼンテーション="休憩" type="休憩"> </休憩>
                </グループ>
            </シーケンス>
        </パス>
...
        <path id="スコアリング">
            <シーケンス>
                <グループ>
                    <scoring presentation="Scoring" type="scoring"> </scoring>
                </グループ>
            </シーケンス>
        </パス>
        <path id="フィードバック">
            <questionFile timeScreen="" timeEstimate="0">フィードバック-CVS</questionFile>
            <シーケンス>
                <グループ>
                    <エクササイズ プレゼンテーション="フィードバック" タイプ="エクササイズ" パス="1">
                        <質問>
                            <question id="fb30"> </question>
                            <question id="fb32"> </question>
                            <question id="fb40"> </question>
                            <question id="fb50"> </question>
                        </質問>
                    </演習>
                </グループ>
            </シーケンス>
        </パス>
    </パス>
</評価データ>

各質問タグが「分解」されていることに注意してください。実際の XML には、ここで示したよりもはるかに多くのものがあります。

この質問をまとめているときに気づいたことの 1 つは、変換によって、変換された XML にも UTF-16 エンコーディングが追加されていることです。誰かがそれを修正する方法について何か考えがあれば、それも大歓迎です:)。

更新
XML と XSL の両方を ASP Classic の MSXML2.DOMDocument.3.0 にロードし、transformNode を使用しています。結果の文字列に対して Replace を使用して UTF エンコーディングを修正できましたが、この解決策には満足していません。

4

1 に答える 1

1

何らかの理由で、Msxml2.DomDocument.3.0 から Msxml2.DomDocument.6.0 に変更すると、最初の問題が修正されました。XSLT でエンコーディングを設定しても、2 番目の問題は解決されませんでした (これは、transformNode の既知の問題のようです)。代わりに、omit-xml-declaration="yes" を使用しました。これは、実際には XML 宣言を省略していませんが、エンコーディング値を省略しています。私がそれを使用しているものについては、それで十分です。

于 2013-09-06T22:43:06.830 に答える