Вы можете сделать это с помощью 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">'</xsl:with-param>
<xsl:with-param name="replace">''</xsl:with-param>
</xsl:call-template>'
,
'<xsl:call-template name="replace">
<xsl:with-param name="text" select="$last-name"/>
<xsl:with-param name="search">'</xsl:with-param>
<xsl:with-param name="replace">''</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/
Большое спасибо, Roland - идеальное решение! – flhe