13

xsl:text次のようなノードにコンテンツを含む XSL スタイルシートがあります。

<xsl:text>
foo
bar
baz
</xsl:text>

スタイルシート自体は、"unix スタイル" の改行行終端文字を含むテキスト ファイルです。このスタイルシートは、Windows および UNIX ライクなプラットフォームで呼び出します。出力が呼び出されるプラットフォームの規則に準拠していると便利です。

このスタイルシートを Windows で実行すると、ノードの内容を除くすべてに対してキャリッジ リターンと改行のペアが出力されます。xsl:text

XSLT プロセッサに、xsl:textノードのコンテンツ内の改行文字をプラットフォーム固有の行末に変換するように指示できますか?

詳細なコンテキスト: 次のように、 Apache Ant 1.7.1 XSLT タスクからスタイルシートを呼び出しています。

<xslt in="in.xml" out="out.xml" style="stylesheet.xsl"/>

スタイルシート ヘッダーは現在、次のようになっています。

<?xml version="1.0"?>
<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xalan="http://xml.apache.org/xslt"
    exclude-result-prefixes="xalan">
    <!-- contents elided -->
</xsl:stylesheet>
4

4 に答える 4

5

次のように、スタイルシートのパラメーターを定義できます。

<xsl:param name="br">
    <xsl:text>&#10;</xsl:text>
</xsl:param>

Ant スクリプトでネストされた param 要素を使用して、適切な行末文字を渡します。もちろん、この例のデフォルトは Unix スタイルの改行です。値を出力するには、次を使用する必要があると思います:

<xsl:copy-of select="$br"/>

冗長ですが、機能します。

于 2008-10-09T15:12:08.467 に答える
4

Ant から変換を呼び出す場合は、OS ファミリのテストで条件付きタスクを使用して OS をテストできます

  <condition property="linebreak" value="&#xD;&#xa;">
      <os family="windows"/>
  </condition>
  <condition property="linebreak" value="&#xa;">
      <os family="unix"/>
  </condition>

次に、そのパラメーターを XSLT に渡して、使用する改行文字を通知します。

 <xslt in="data.xml" out="${out.dir}/out.xml">
   <param name="linebreak" expression="${linebreak}" />
 </xslt>
于 2008-10-10T15:50:26.787 に答える
1

正しい改行を自動的に行う方法はわかりませんが (使用している xslt プロセッサに依存する場合があります)、テキスト ノードのコンテンツに改行を強制できる場合があります。\r\n は &#xD; &#xA;、\n は です&#xA;。たとえば、次のように使用します。

<xsl:text>foo&#xD;&#xa;bar&#xD;&#xa;</xsl:text>探している出力を取得します。

于 2008-10-08T22:49:27.280 に答える
0

さて、私は上記の2つのアイデアを組み合わせて(Saxonを使用して)動作させました:

<xsl:param name="br">
        <xsl:text>&#xD;&#xa;</xsl:text>
</xsl:param>

そして、必要に応じてこれらのような行を使用します。

<xsl:value-of select="$br" />

ここに私の完全な(しかしスリムな)xslがあります

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <!--<xsl:strip-space elements="*" />-->
  <xsl:output method="text" />
  <!-- <xsl:preserve-space elements="*"/>-->
<xsl:param name="br">
        <xsl:text>&#xD;&#xa;</xsl:text>
</xsl:param>


  <!--  -->
  <xsl:template match="/">


    <xsl:for-each select="//root/Item">

        <xsl:value-of select="@Name" /> <!-- Your xpath will vary of course! -->
        <xsl:value-of select="$br" />

    </xsl:for-each>

</xsl:template>

繰り返しますが、Windows 7 x64 マシンで Saxon %ProgramFiles%\SaxonHE\bin\Transform.exe を使用しています。

于 2011-04-28T21:02:45.073 に答える