2011-06-23 130 views
2

我正在生成MySQL的创建表语句。我的源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

您必须明确管理每个迭代(或模板)中的条件。

通常你使用XPath查询针对当前位置,下面的兄弟姐妹,如:

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> 

应用于此输入:

<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