1

xsl でいくつかの作業を行っています - 初めて重大なことを行いましたが、説明できない何かにぶつかりました。それを示す最も簡単な方法は、恒等変換を使用することです。

これは機能します:

<xsl:template match="@*|node()">
  <xsl:copy>
    <xsl:apply-templates select="@*|node()"/>
  </xsl:copy>
</xsl:template>

これはしません(「現在のソースに変換を適用できません」と言います):

<xsl:template match="@*|node()" xml:space='preserve'>
  <xsl:copy>
    <xsl:apply-templates select="@*|node()"/>
  </xsl:copy>
</xsl:template>

これは次のことを行います。

<xsl:template match="@*|node()">
  <xsl:copy>
    <xsl:apply-templates select="@*"/>
    <xsl:apply-templates select="node()" xml:space='preserve'/>
  </xsl:copy>
</xsl:template>

わかりました、何が起こっているかがわかります。しかし、私はその理由を理解していません。xml:space が属性をうまく処理したくないのはなぜですか? ちょっと興味があるんだけど。

ところで、これは Notepad++ に組み込まれている xsl トランスレータを使用しています。信用してはいけないのではないでしょうか?

4

2 に答える 2

3

何を達成しようとしていますか?属性でxml:space="preserve"ある要素の子孫である空白のみのテキスト ノードを保持する必要がある XML を使用するアプリケーションに指示します。xml:spaceこの例ではxml:space、属性として がありますが<xsl:apply-templates><xsl:apply-templates>空白のみのテキスト ノードの子孫xml:spaceがないため、影響はありません。

入力 XML ドキュメント(XSLT スタイルシートからではなく) から空白のみのテキスト ノードを保持したかったと思います。その場合、xml:spaceXSLT スタイルシートではなく、入力 XML ドキュメントにいる必要があります。スタイルシートには を含めることができますがxsl:preserve-space-elements="*"、設定していない限り、それが既にデフォルトになっていますxsl:strip-space-elements

はい、Notepad++ で使用される XSLT プロセッサ (libxml) が違法なことを行っているのではないかと考えたくなります。適切な診断として、Saxon などの信頼できるプロセッサを試して、エラーが発生するかどうかを確認してください。

xml:spaceプロセッサがエラーをスローしなくても何の役にも立たないため、それを行うか、スタイルシートから削除するだけです。

提案:

使うだけ

<xsl:output method="html" indent="yes"/>

の最初の子として<xsl:stylesheet>。これindent="yes"により、すべての出力要素が 1 行に詰め込まれるのを防ぐことができるため、結果を読み取ることができます。

于 2013-04-22T18:35:02.727 に答える