XSLT - убрать последнюю запятую - PullRequest
2 голосов
/ 23 июня 2011

Я генерирую операторы MySQL для создания таблиц.Мой исходный XML выглядит так:

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

Трансформация выполняется как

<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?Спасибо

Ответы [ 3 ]

5 голосов
/ 23 июня 2011

Для фиксированных строк, содержащих запятые, посмотрите на функцию substring-before-last, которую я реализовал как ответ на другой вопрос .

Если вы создаете запятую самостоятельно в XSLT, просто избегайте ее, если она будет неправильной.

<xsl:for-each select="...">
  <!-- ... -->
  <xsl:if test="position() &lt; last()">,</xsl:if>
</xsl:for-each>
1 голос
/ 23 июня 2011

Вы должны явно управлять условием внутри каждой итерации (или шаблона).

Обычно вы используете 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
0 голосов
/ 23 июня 2011

Мб last() или position() функции помогут вам?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...