2

すべての属性の改行を代替文字に置き換えるには、XSLT (または何か- 以下を参照) が必要です。

すべてのデータを属性として保存し、カーディナリティを表現するために改行を使用する従来の XML を処理する必要があります。例えば:

<sample>
    <p att="John
    Paul
    Ringo"></p>
</sample>

これらの改行は、Java でファイルを解析するときに (XML 仕様に従って) 空白に置き換えられますが、それらをリストとして扱いたいので、この動作は特に役に立ちません。

私の「解決策」は、XSLT を使用してすべての属性のすべての改行を他の区切り文字に置き換えることでしたが、XSLT の知識はまったくありません。これまで見てきたすべての例は、非常に具体的であるか、属性値の代わりにノード コンテンツを置き換えていました。

私は XSLT 2.0 に手をreplace()出しましたが、すべてをまとめるのに苦労しています。

XSLT は正しい解決策ですか? 以下の XSLT を使用します。

<xsl:template match="sample/*">
    <xsl:for-each select="@*">
        <xsl:value-of select="replace(current(), '\n', '|')"/>
    </xsl:for-each>
</xsl:template>

サンプル XML に適用すると、Saxon を使用して次のように出力されます。

John Paul Ringo

明らかに、この形式は私が求めているものではありません - これは単に実験するためのものですreplace()- しかし、XSLT 処理に到達するまでに、改行は既に正規化されていますか? もしそうなら、Javaパーサーを使用してこれらの値を書き込みとして解析する他の方法はありますか? これまでのところ、JAXB のみを使用してきました。

4

3 に答える 3

2

これを作るのは難しそうですね。私が見つけたようにXML属性値の改行は許可されていますか? - 属性の改行文字は有効ですが、XML パーサーはそれを正規化します ( https://stackoverflow.com/a/8188290/1324394 )。そのため、処理前 (つまり置換前) に失われる可能性があります。

于 2013-07-02T07:22:34.390 に答える
0

XSLT は、属性値の正規化を行った XML パーサーによって処理された後にのみ、XML を認識します。

一部の XML パーサーには、属性値の正規化を抑制するオプションがあると思います。そのようなパーサーにアクセスできない場合は、&#x0A;解析の前に (\r?\n) のテキスト置換を行うことが最善の回避策になると思います。この方法でエスケープされた改行は、属性値の正規化によって分割されません。

于 2013-07-02T12:06:01.477 に答える