2011-01-20 14 views
-1

同じ行で右揃えと左揃えを処理する必要があります。私は私の既存のXSLコードにそれを適用しようとしたとき、私はそれを動作させることはできません(下記参照)と同様の反応を見ている、私は以下の勧告を見つけ、既存の並べ替え/条件付きXSL FOインラインアラインメントXSL

<fo:block text-align-last="justify"> 
    LEFT TEXT (want this to be the Contacts element from the below) 
    <fo:leader leader-pattern="space" /> 
    RIGHT TEXT (want this to be the Address1 element from the below) 
</fo:block> 

しかし - 私はどのようにについて十分に知りませんソート/条件文とFOの両方を収容/マージするためにそれを編集します。誰かが私にこの権利を手伝うことができますか?

Exsiting /作業コード:

<?xml version="1.0"?><!-- DWXMLSource="XML - Builder Members.xml" --> 
<!DOCTYPE xsl:stylesheet [<!ENTITY nbsp "&#160;">]> 

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
    <xsl:output method="xml" indent="no"/> 

    <xsl:template match="/"> 
    <memberdata> 
     <xsl:for-each select="memberdata/memberinfo"> 
     <xsl:sort select="SortKey"/> 
     <memberdata> 
      <xsl:if test="Contacts[.!='']"> 
      <Contacts><xsl:value-of select="Contacts" /></Contacts> 
      <xsl:text>&#10;</xsl:text> 
      </xsl:if> 
      <xsl:if test="Address1[.!='']"> 
      <Address1><xsl:value-of select="Address1" /></Address1> 
      <xsl:text>&#10;</xsl:text> 
      </xsl:if> 
     </memberdata> 
     </xsl:for-each> 
    </memberdata> 
    </xsl:template> 
</xsl:stylesheet> 
+2

あなたのXSLTコードには「」が含まれていません。あなたのやりたいことはわかりません。 – Tomalak

+0

@Tom:希望の出力がなければ、これは本当の質問ではありません。 –

+0

これはよく定義された質問ではありません。 – Flack

答えて

0

独自に(質問がである現在の形で与えることは不可能である)あなたの質問に答え、実際の、私はいくつかの改善点を提案したいと思いますXSLTへのあなたの一般的なアプローチ:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
    <xsl:output method="xml" indent="no"/> 

    <xsl:template match="memberdata"> 
    <xsl:copy> 
     <xsl:apply-templates select="memberinfo"> 
     <xsl:sort select="SortKey" /> 
     </xsl:apply-templates> 
    </xsl:copy> 
    </xsl:template> 

    <xsl:template match="memberinfo"> 
    <memberdata> 
     <xsl:apply-templates select="Contacts" /> 
     <xsl:apply-templates select="Address1" /> 
    </memberdata> 
    </xsl:template> 

    <xsl:template match="Contacts|Address1"> 
    <xsl:if test="normalize-space() != ''"> 
     <xsl:copy-of select="." /> 
     <xsl:text>&#10;</xsl:text> 
    </xsl:if> 
    </xsl:template> 

</xsl:stylesheet> 
  • <xsl:for-each>を避けるには、明確なテンプレートや<xsl:apply-templates>代わりに使用します。これにより、よりクリーンで、重複が少なく、深くネストされていないコードになります。また、XSLTプロセッサはテンプレートマッチング用に最適化されており、テンプレートの実行を並列化できるため、スタイルシートの効率的な処理が可能になります。
  • 複数の要素に同じテンプレートを使用できます(上記の3番目のテンプレートを参照)。
  • このような構造体を使用して改行を追加しないでください:<xsl:text>
    </xsl:text>
    これにより、ソースコードの可読性が損なわれ、ソースコードがにフォーマットされるとすぐにエラーが発生しやすくなります(最初に適切にコードをインデントできるようにするために私はすでにこれを行っています)。代わりに文字コード&#10;を使用して、ソースコードレイアウトと出力レイアウトを区切ります。
  • <xsl:copy-of>を使用して要素のコピーを作成できます。<foo><xsl:value-of select="foo" /></foo>は不要です。額面であなたの要求を取る
+0

Tomalak thxしかし、InDesign CS5にインポートすると2つの別々の広告申込情報が表示され、すべてが左揃えになります。 – Tom

+0

質問にさらに情報を追加する必要があります。 – Tomalak

+3

ここでは、(a)スタイルシートから必要な出力と、(b)(a)で指定した出力を生成するスタイルシートを取得する方法の2つの質問があります。 InDesignについてのあなたのコメントは、あなたが(a)について確信が持てないことを示唆しています。もしそうなら、あなたは(b)に有益な答えを得ることを望む前にそれをまっすぐにする必要があります。 – LarsH

0

、これはソート、条件文とFOをマージしている、あなたが求めているもののようです。

<?xml version="1.0"?><!-- DWXMLSource="XML - Builder Members.xml" --> 
<!DOCTYPE xsl:stylesheet [<!ENTITY nbsp "&#160;">]> 

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
    <xsl:output method="xml" indent="no"/> 

    <xsl:template match="/"> 
    <memberdata> 
     <xsl:for-each select="memberdata/memberinfo"> 
     <xsl:sort select="SortKey"/> 
     <memberdata> 
      <fo:block text-align-last="justify"> 
      <xsl:if test="Contacts[.!='']"> 
       <Contacts><xsl:value-of select="Contacts" /></Contacts> 
       <xsl:text>&#10;</xsl:text> 
      </xsl:if> 
      <fo:leader leader-pattern="space" /> 
      <xsl:if test="Address1[.!='']"> 
       <Address1><xsl:value-of select="Address1" /></Address1> 
       <xsl:text>&#10;</xsl:text> 
      </xsl:if> 
      </fo:block> 
     </memberdata> 
     </xsl:for-each> 
    </memberdata> 
    </xsl:template> 
</xsl:stylesheet> 

後でフルFO文書を生成するためにそれらを処理する予定がない限り、しかしそれは...あなたが本当にあなたの出力に<fo:*>要素および他の要素(<memberdata>)をミックスしたいとは考えにくいです。だから上の方があなたが必要とする解決策ではないかもしれません。

(XSLTを改善する方法については、@ Tomalakの良い点を参照してください。私は、for-eachとapply-templatesの問題についてのみ彼とは違うでしょう...それは実際にいくつかの要因と優先順位。)

+0

LarsH thx Dreamweaverでコードを検証しようとすると、次のエラーメッセージが表示されます。 接頭辞「fo」はURIにマップされていません[xml] 対処方法? – Tom

+1

@Tom、実際に私があなたに与えたXSLTは整形式のXMLではありませんでした。謝罪。しかし、スタイルシートの開発を計画している場合は、名前空間宣言の基礎を学ぶ必要があります。名前空間接頭辞 'fo'は宣言されていないので、通常はxsl:stylesheet要素に宣言を追加する必要があります: '' – LarsH

関連する問題