2011-06-23 28 views
2

私はMySQLのcreate tableステートメントを生成しています。私のソースXMLは次のようになります。XSLT - 最後のカンマを削除

<table name="TabName"> 
    <column> ... </column> <!-- multiple columns --> 
    <primary-key> ... </primary-key> 
    <foreign-key> ... </foreign-key> <!-- multiple FKs --> 
    <key>... </key> <!-- multiple indexes --> 
</table> 

Transformatinが

<xsl:for-each select="column"> blabla ,</xsl:for-each> 
<xsl:if test="primary-key"> blabla, </xsl:if> 
<xsl:for-each select="key"> blabla, </xsl:for-each> 
<xsl:for-each select="foreign-key"> blabla, </xsl:for-each> 

のように行われ、私はすべての文の末尾にコンマを追加することに注意してください。 SQL出力後、次のようになります。

CREATE TABLE`categories` (
      `CategoryID` tinyint(5) unsigned NOT NULL, 
      `CategoryName` varchar(15) NOT NULL, 
      `Description` mediumtext NOT NULL, 
      `Picture` varchar(50) NOT NULL, 
      PRIMARY KEY (`CategoryID`),) --here is bad column  
    ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; 

XSLT変換を実行するときに、そのコンマを削除するにはどうすればよいですか?ありがとう

答えて

5

カンマを含む固定文字列の場合、私が実装したsubstring-before-last関数をan answer to another questionとして見てください。

XSLTで自分自身を作成する場合は、誤っている場合は作成しないでください。

<xsl:for-each select="..."> 
    <!-- ... --> 
    <xsl:if test="position() &lt; last()">,</xsl:if> 
</xsl:for-each> 
+0

これは実際に働いていました:)しかし、確かに存在するすべての新しい行の前にカンマを追加すると、より良い解決策が見つかりました。後に。それはトリックをさらに良くしました。 – Xorty

+0

@Xortyできますが、あなたはその存在について本当に確信している必要があります。それ以外の場合は、まだ条件が必要です。 –

0

Mb last()またはposition()機能はあなたを助けますか?

+0

うーん、私はどのように見ることができません。いくつかの例を挙げることができますか? – Xorty

+0

http://stackoverflow.com/questions/6452563/xslt-remove-last-comma/6453148#6453148 –

1

各繰り返し(またはテンプレート)内で条件を明示的に管理する必要があります。

例えば
position()!=last() 

または

count(following-sibling::*)!=0 

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
    <xsl:output method="text" media-type="text" encoding="UTF-8" indent="no" /> 
    <xsl:strip-space elements="*"/> 

    <xsl:param name="component" select="4"/> 

    <xsl:template match="table"> 
     <xsl:apply-templates select="column|primary-key|key|foreign-key"/> 
    </xsl:template> 

    <xsl:template match="column"> 
     <xsl:text>blabla</xsl:text> 
     <xsl:if test="position()!=last()"> 
      <xsl:text>,&#xa;</xsl:text> 
     </xsl:if> 
    </xsl:template> 

    <xsl:template match="primary-key"> 
     <xsl:text>blabla</xsl:text> 
     <xsl:if test="position()!=last()"> 
      <xsl:text>,</xsl:text> 
     </xsl:if> 
    </xsl:template> 

</xsl:stylesheet> 

応用をこの入力に

通常は同じように、現在位置または次の兄弟に対してチェックするためにXPathを使用します。

<table name="TabName"> 
    <column>a</column> <!-- multiple columns --> 
    <column>b</column> <!-- multiple columns --> 
    <column>c</column> <!-- multiple columns --> 
    <primary-key>pk1</primary-key> 
</table> 

取得:

blabla, 
blabla, 
blabla, 
blabla 
関連する問題