[編集:質問をよりよく概念化するためにタイトルを変更しました。]
属性の値は、またはの@xml:space
いずれ"default"
かになります"preserve"
。XMLは、2番目の意味を指定しますが、最初の意味はアプリケーションに任せます。(私はそれが正しいと思います。)では、アプリケーションがdefault
XSchemaを実装したい場合はどうcollapse
でしょうか。XSLT 1.0は実際にこれをどのように行うことができますか?
テキストを処理するための組み込みテンプレート、つまり
<xsl:template match="text()">
<xsl:value-of select="."/>
</xsl:template>
次のような擬似コードに置き換える必要があります。
<xsl:choose>
<xsl:when test="../@xml:space='preserve'"
<xsl:value-of select="."/>
</xsl:when>
<xsl:otherwise>
if position(.)=1 then output LTRIM(value-of(.))
if position(.)=last() then output RTRIM(value-of(.))
if position(.)= 1 and last()=1 then output normalize-space(.)
</xsl:otherwise>
</xsl:choose>
この入力は次のとおりです。
<persName> The man is
<forename>Edward</forename>
<forename>George</forename>
<surname type="linked">Bulwer-Lytton</surname>, <roleName>Baron Lytton of
<placeName>Knebworth</placeName>
</roleName>
</persName>
トリミングのThe man is Edward George Bulwer-Lytton, Baron Lytton of Knebworth
前後のスペースや、との間のスペースが折りたたまれている場合と同様に、The man
正しくレンダリングされます。(例はTEIからのものです。)Knebworth
Edward
George
[編集:ここで誤った誤解を招く段落を削除しました。]
その擬似コードを実装するためのXSLT1.0は、すべてのテキストノードに対して実行する必要があります。それは醜くて遅いのではないでしょうか?[編集:またはそうではないかもしれません。擬似コードを簡略化しました。高速トリムルーチンはありますか?選択は本当に遅いですか?]
結論:XSLT 1.0でXSchemaの崩壊をどのように実装しますか(ブラウザーに埋め込まれた拡張機能のみを使用)?
私はそれをすべて正しく言っていると思います。そして、コードが単純であることを願っています。私はそれがどうなるかまだ見ていません。[編集:xs:collapseをXSchemaのcollapseに変更しました。]