1

[編集:質問をよりよく概念化するためにタイトルを変更しました。]

属性の値は、またはの@xml:spaceいずれ"default"かになります"preserve"。XMLは、2番目の意味を指定しますが、最初の意味はアプリケーションに任せます。(私はそれが正しいと思います。)では、アプリケーションがdefaultXSchemaを実装したい場合はどう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からのものです。)KnebworthEdwardGeorge

[編集:ここで誤った誤解を招く段落を削除しました。]

その擬似コードを実装するためのXSLT1.0は、すべてのテキストノードに対して実行する必要があります。それは醜くて遅いのではないでしょうか?[編集:またはそうではないかもしれません。擬似コードを簡略化しました。高速トリムルーチンはありますか?選択は本当に遅いですか?]

結論:XSLT 1.0でXSchemaの崩壊をどのように実装しますか(ブラウザーに埋め込まれた拡張機能のみを使用)?

私はそれをすべて正しく言っていると思います。そして、コードが単純であることを願っています。私はそれがどうなるかまだ見ていません。[編集:xs:collapseをXSchemaのcollapseに変更しました。]

4

5 に答える 5

0

これがあなたが望むものに近いものです...

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" indent="yes"/>
<xsl:strip-space elements="*"/>  

<xsl:template match="/">
Demonstration of collapsed white space.
=======================================
<xsl:apply-templates select="*"/>
</xsl:template>

<xsl:template match="text()">
  <xsl:value-of select="concat(normalize-space(.),' ')" />  
</xsl:template>

</xsl:stylesheet>

これは出力を生成します...

Demonstration of collapsed white space.
=======================================
The man is Edward George Bulwer-Lytton , Baron Lytton of Knebworth
于 2012-07-07T05:55:09.633 に答える
0

の定義を正しく理解していませんxml:space

空白のみのテキスト ノードにのみ適用されます。これは、非空白文字も含むテキスト ノードに含まれる空白文字 (「重要な空白」とも呼ばれます) には適用されません。

XML 1.0 仕様から:

一方、配信されたバージョンで保持されるべき「重要な」空白は、たとえば詩やソース コードなどでよく見られます

したがって、テキスト ノードを「トリミング」するという全体的な考え方は、 とは何の関係もありませんxml:space

このリソースxml:spaceには、属性のわかりやすい説明が含まれてい

更新

回答の OP は、彼の最初の要件を変更しました。今、彼が望んでいるのは(彼の答えの私の理解が正しければ)同じ親を持つすべての空白のみのテキストノードで最初の(そして私も最後だと思う)空白のみのテキストノードを削除することです。

これは簡単です。次のテンプレートを XSLT スタイルシートに追加するだけです。

<xsl:template match=
   "text()[not(normalize-space())][position() = 1 or position() = last()]"/>
于 2012-07-07T14:53:29.507 に答える
0

xml-dev で確認したところ、@xml:space の意味と使用目的については正しかったことがわかりました。

混合コンテンツ要素の空白を正規化するコードを次に示します (これは、私がやりたかったことをより適切に表現する方法です)。

<xsl:template priority=".7" match="text()[position()=1 and not((ancestor::node()/@xml:space)[position()=last()]='preserve')]">
    <xsl:value-of select="normalize-space()"/>
    <xsl:if test="normalize-space(substring(., string-length(.))) = ''">
        <xsl:text> </xsl:text>
    </xsl:if>
</xsl:template>
<xsl:template priority=".7" match="text()[position()=last() and not((ancestor::node()/@xml:space)[position()=last()]='preserve')]">
    <xsl:if test="normalize-space(substring(., 1, 1)) = ''">
        <xsl:text> </xsl:text>
    </xsl:if>
    <xsl:value-of select="normalize-space()"/>
</xsl:template>
<xsl:template priority=".8" match="text()[position()=1 and position()=last() and not((ancestor::node()/@xml:space)[position()=last()]='preserve')]" >
    <xsl:value-of select="normalize-space(.)"/>
</xsl:template>

フィルタリングするとオーバーライド@xml:spaceできます。preserveこれtest=は、空白をテストするための単なる方法です。優先順位は、ノードが要素内の唯一のテキスト ノードである場合、つまり最初と最後の両方のノードである場合に発生する競合を解決します。

于 2012-07-25T13:01:20.790 に答える
0

良い編集。ありがとうディミトレ。

私は仕様を間違って読んでいるとは確信していませんが、少しの間、そうであると仮定します。私の例を修正させてください(それは私に来たときに残すべきだったかもしれません)。

<persName>
   <forename>Edward</forename>
   <forename>George</forename>
   <surname type="linked">Bulwer-Lytton</surname>, <roleName>Baron Lytton of
   <placeName>Knebworth</placeName>
   </roleName>
</persName>

<forename>Edward</forename>直前の空白のみのテキスト ノードは削除されますが、直後の空白のみのテキスト ノードは削除されないというデフォルトの処理が必要です<forename>Edward</forename>

しかしまた、xml:space が、たとえば xsl:strip-space のように、空白のみのテキスト ノードの包含または削除のみを参照していることも明らかではありません。実際、2.10 ホワイト スペース処理では、お気づきのように、詩とソース コードを例として使用しています。これらは、スペースがテキスト ノード内にある場合です。@xml:space は、そのスペースの処理方法を識別します。アプリケーションのデフォルトの方法で保存または処理する必要がありますか?

http://www.xmlplease.com/xml/xmlspace/はこれで間違っていると思います。

于 2012-07-07T16:51:59.320 に答える