2

ソースから絶対に何も変更されていない xslt アイデンティティ変換を行うことは可能ですか?

次のテンプレートを使用すると、出力で ident と改行が変更され、ソース xml を変更したくありません。

XSLT

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="@*|node()">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>  
</xsl:template>

入力

<S:Envelope
  xmlns:S="http://www.w3.org/2003/05/soap-envelope" 
  xmlns:wsa="http://schemas.xmlsoap.org/ws/2004/08/addressing"
  xmlns:f123="http://www.fabrikam123.example/svc53">
  <S:Header>
    <wsa:MessageID>
      uuid:aaaabbbb-cccc-dddd-eeee-wwwwwwwwwww
    </wsa:MessageID>
    <wsa:RelatesTo>
      uuid:aaaabbbb-cccc-dddd-eeee-ffffffffffff
    </wsa:RelatesTo>
    <wsa:To S:mustUnderstand="1">
      http://business456.example/client1
    </wsa:To>
    <wsa:Action>http://fabrikam123.example/mail/DeleteAck</wsa:Action>
  </S:Header>
  <S:Body>
    <f123:DeleteAck/>
  </S:Body>
</S:Envelope>

出力

<?xml version="1.0" encoding="UTF-8"?><S:Envelope xmlns:S="http://www.w3.org/2003/05/soap-envelope" xmlns:wsa="http://schemas.xmlsoap.org/ws/2004/08/addressing" xmlns:f123="http://www.fabrikam123.example/svc53">
  <S:Header>
    <wsa:MessageID>
      uuid:aaaabbbb-cccc-dddd-eeee-wwwwwwwwwww
    </wsa:MessageID>
    <wsa:RelatesTo>
      uuid:aaaabbbb-cccc-dddd-eeee-ffffffffffff
    </wsa:RelatesTo>
    <wsa:To S:mustUnderstand="1">
      http://business456.example/client1
    </wsa:To>
    <wsa:Action>http://fabrikam123.example/mail/DeleteAck</wsa:Action>
  </S:Header>
  <S:Body>
    <f123:DeleteAck/>
  </S:Body>
</S:Envelope>
4

3 に答える 3

2

いいえ、あなたがすることはできません。入力XMLと出力XMLは、同じXMLインフォセットを生成するという意味で「同じ」になりますが、必ずしもバイトごとに同一である必要はなく、これはXSLTが制御できるものではありません。

なぜこれが必要なのですか?XMLドキュメントを簡単に比較しようとしている場合は、XML正規化の使用を検討してください。多くのXMLライブラリには、正規のXMLを生成する方法があり、xmllintコマンドラインツールでファイルから簡単に生成できます。

于 2013-02-18T22:01:22.837 に答える
1

XSLT プロセッサのデフォルトの動作は、入力内の空白を保持することであり、テストしたばかりのプロセッサの動作は仕様と一致しています。

しかし、問題の空白は、入力のテキスト ノード内の空白です。

開始タグの属性値仕様間の空白、およびドキュメントのプロローグとエピローグの項目 (コメントや処理命令など) 間の空白はテキスト ノードではなく、preserve-space 設定の影響を受けません。実際、その空白も XPath データ モデルの一部ではないため、プロセッサがそれを保持するために正当にできることはほとんどありません。

問題の空白に情報が含まれている場合は、ボキャブラリの設計を再検討する必要があります (その空白が重要であるというのは、本当に悪い考えです)。属性値の指定の間に改行を入れたいだけの場合は、出力にそのような改行とインデントを挿入するカスタム シリアライザーを作成することをお勧めします。(差分プログラムを空白の違いと混同しないようにすることが動機である場合、私の経験では、差分を行う前に空白を正規化するか、空白のバリエーションに直面してももう少し堅牢な差分プログラムを取得することを選択できます。) 頑張ってください。

于 2013-02-18T21:43:51.290 に答える