2010-01-05 2 views
1

Я хочу преобразовать большой XML-файл в sql-операторы с помощью xslt. Например, у меня есть тег автора.Сплит XML-теги и преобразование в SQL

<author>Evans, Jim; Henderson, Mike; Coyier, Alan</author> 

У меня есть столбец для last_name и first_name, так Эванс, Хендерсон и Coyier должны идти last_name и так далее.

Как я могу выбрать их из тега и поместить в SQL-заявления!

Заранее спасибо!

ответ

0

Вы можете сделать это с помощью xslt, но это не очень красиво, поскольку вам нужно проанализировать пары lastname/firstname, а затем имя lastname - firstname самостоятельно. Это делается путем рекурсии.

В том же XSLT можно генерировать SQL заявление от него, но опять-таки это не безболезненно, как у вас есть, чтобы избежать каких-либо буквенных разделителей строк, например, O'Hanlon должен стать SQL строкового литерала 'O''Hanlon'.

Опять же, это делается с рекурсией.

Это пример, который полностью функционален:

<?xml version="1.0" encoding="ISO-8859-1"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

    <xsl:output method="text"/> 

    <!-- match the eelement to extract data from --> 

    <xsl:template match="/author"> 
    <xsl:call-template name="authors"> 
     <xsl:with-param name="authors" select="text()"/> 
    </xsl:call-template> 
    </xsl:template> 

    <!-- recursively extract individual authors --> 
    <xsl:template name="authors"> 
    <xsl:param name="authors"/> 
    <xsl:variable name="author" select="substring-before($authors,';')"/> 
    <xsl:choose> 
     <xsl:when test="string-length($author)=0"> 
     <xsl:call-template name="author"> 
      <xsl:with-param name="author" select="$authors"/> 
     </xsl:call-template> 
     </xsl:when> 
     <xsl:otherwise> 
     <xsl:call-template name="author"> 
      <xsl:with-param name="author" select="$author"/> 
     </xsl:call-template> 
     <xsl:call-template name="authors"> 
      <xsl:with-param name="authors" select="substring-after($authors,';')"/> 
     </xsl:call-template>   
     </xsl:otherwise> 
    </xsl:choose> 
    </xsl:template> 

    <!-- extract firstname, lastname, escape single quote, and generate SQL --> 
    <xsl:template name="author"> 
    <xsl:param name="author"/> 
     <xsl:variable name="last-name" select="normalize-space(substring-before($author, ','))"/> 
     <xsl:variable name="first-name" select="normalize-space(substring-after($author, ','))"/> 
     INSERT INTO author (first_name, last_name) VALUES (
     '<xsl:call-template name="replace"> 
      <xsl:with-param name="text" select="$first-name"/> 
      <xsl:with-param name="search">&apos;</xsl:with-param> 
      <xsl:with-param name="replace">&apos;&apos;</xsl:with-param> 
     </xsl:call-template>' 
     , 
     '<xsl:call-template name="replace"> 
      <xsl:with-param name="text" select="$last-name"/> 
      <xsl:with-param name="search">&apos;</xsl:with-param> 
      <xsl:with-param name="replace">&apos;&apos;</xsl:with-param> 
     </xsl:call-template>' 
    ); 
    </xsl:template> 

    <!-- recursive search and replace --> 
    <xsl:template name="replace"> 
    <xsl:param name="text"/> 
    <xsl:param name="search"/> 
    <xsl:param name="replace"/> 
    <xsl:value-of select="$text"/> 
    <xsl:variable name="tail"> 
     <xsl:if test="contains($text, $search)"> 
     <xsl:call-template name="replace"> 
      <xsl:with-param name="text" select="substring-after($text, $search)"/> 
      <xsl:with-param name="search" select="$search"/> 
      <xsl:with-param name="replace" select="$replace"/> 
     </xsl:call-template> 
     </xsl:if> 
    </xsl:variable> 
    <xsl:value-of select="concat(substring-before($text, $search), $tail)"/> 
    </xsl:template> 
</xsl:stylesheet> 

с входом:

<?xml version="1.0"?> 
<?xml-stylesheet type="text/xsl" href="author.xslt"?> 
<author>Evans, Jim; Henderson, Mike; Coyier, Alan</author> 

Это дает мне этот выход:

INSERT INTO author (first_name, last_name) VALUES ('Jim' , 'Evans'); 
INSERT INTO author (first_name, last_name) VALUES ('Mike' , 'Henderson'); 
INSERT INTO author (first_name, last_name) VALUES ('Alan' , 'Coyier'); 

Если вам нужно сделать много XML munging и вставляя его в базы данных, я могу порекомендовать использовать такой инструмент, как чайник, ака. интеграция данных пентахо. Он имеет много шагов, которые можно использовать для обработки данных и подключения к более чем 30 базам данных. Он бесплатный и прост в установке. получите его здесь: http://sourceforge.net/projects/pentaho/files/Data%20Integration/

+0

Большое спасибо, Roland - идеальное решение! – flhe

Смежные вопросы