使用XML文件数据创建SQL INSERT语句
我想使用XSLT从XML文件中编码的数据生成SQLINSERT语句 例如,我的XML文件包括以下标记(描述墓碑): 我最初的问题(现已解决)是: 在找到一些示例后,我尝试将输出方法设置为text 联机,但这给了我错误消息“非空白” “xs:appinfo”以外的架构元素中不允许使用字符 和“xs:documentation” 我将文件格式更改为xsl,现在它不再抱怨非空白字符。我现在可以将文本放入最终输出。以下(受您的回答启发)是我的XSLT的当前状态,现在我只想尝试插入标题的值,其位置是“TEI/teiHeader/fileDesc/titlesmt/title”:使用XML文件数据创建SQL INSERT语句,sql,xml,xslt,Sql,Xml,Xslt,我想使用XSLT从XML文件中编码的数据生成SQLINSERT语句 例如,我的XML文件包括以下标记(描述墓碑): 我最初的问题(现已解决)是: 在找到一些示例后,我尝试将输出方法设置为text 联机,但这给了我错误消息“非空白” “xs:appinfo”以外的架构元素中不允许使用字符 和“xs:documentation” 我将文件格式更改为xsl,现在它不再抱怨非空白字符。我现在可以将文本放入最终输出。以下(受您的回答启发)是我的XSLT的当前状态,现在我只想尝试插入标题的值,其位置是“TE
但是,正如您所看到的,它没有插入标题的值。我不知道为什么这不起作用(现在只尝试标题)。只需使用模板沿着树走下去,并用SQL查询的
值
子句所需的引号和逗号连接值即可。由于XML有许多嵌套结构,祖先::*
和后代::*
路径用于特定的节点值提取
注意:此解决方案适用于一个标题的XML文件。您将需要定制此解决方案或为其他类型运行其他XSLT脚本
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:doc="http://www.tei-c.org/ns/1.0">
<xsl:output method="text" encoding="UTF-8" omit-xml-declaration="yes" indent="no"/>
<xsl:template match="/doc:TEI">
<xsl:text>INSERT INTO tblObjects</xsl:text>
<xsl:text>(ObjectID, Title, TMid, Material, ObjectType, Height)
VALUES
</xsl:text>
<xsl:apply-templates select="doc:teiHeader/doc:fileDesc/doc:sourceDesc/doc:msDesc/doc:physDesc"/>
</xsl:template>
<xsl:template match="doc:physDesc">
<xsl:variable name="quote">'</xsl:variable>
<xsl:value-of select="concat('(',
$quote, ancestor::doc:fileDesc/doc:titleStmt/doc:title, $quote, ', ',
ancestor::doc:fileDesc/doc:publicationStmt/doc:idno[@type='TM'], ', ',
$quote, normalize-space(descendant::doc:material), $quote, ', ',
$quote, normalize-space(descendant::doc:objectType), $quote, ', ',
descendant::doc:dimensions/doc:height,
')'
)"/>
</xsl:template>
</xsl:stylesheet>
插入到tblObjects中
(ObjectID、Title、TMid、Material、ObjectType、Height)和#xa;值
;
&载脂蛋白;
标记您的dbms,xml工具是特定于产品的。请显示xml的根标记,因为默认名称空间可能存在,并且XSLT需要它。错误消息似乎表明,在某种程度上,文件被视为架构文档。您还没有给出任何关于为什么会发生这种情况的线索,您的问题中没有提到架构,只是在错误消息中。谢谢您,我发现我不小心将文件保存为.xsd而不是.xsl,我认为这是导致我出现错误的原因。您知道!在根节点中有一个默认名称空间。此外,teiHeader是否对其他相同的节点重复,但值不同?通常对于XML问题,我们需要根节点和足够的示例来理解XML模式。实际上,SQL中只需要使用一组或多组值吗?谢谢,Parfait。我在帖子中编辑了原始代码。现在文本正在工作并显示在输出中。我现在正在尝试将XML文件中的值插入到输出中,但这目前不起作用。您看到我发布的演示的解决方案了吗?您需要根据实际的XML进行调整。另外,正如我在上面所评论的,我们需要实际的XML示例。不,我在哪里可以看到这些标签:
TEI/teiHeader/fileDesc/titlesmt/
。感谢大家的提醒,我没有看到演示,只是看到了您发布的代码。嗯,在指南中,它说我不应该发布整个文件,所以我尝试将其剪切到绝对最小值,事实上整个文件有300多行,但我现在明白了为什么这不起作用,我将在几分钟内添加我的文件的缩写版本。我添加了上面实际文件的摘录,以便您可以看到文件中使用的实际标记。请参阅仅适用于您发布内容的更新脚本和演示。根据您的一般回答,我不知道XML是如何为多人、多石、多语言等构建的。您需要定制此XSLT以处理此类规范或运行不同的XSLT。
INSERT INTO tblObjects
(ObjectID, Title, TMid, Material, ObjectType, Height)
VALUES
('Funerary inscription for Marcellus, a smith', 491539, 'marble', 'tabula', 29);
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"
encoding="UTF-8"
omit-xml-declaration="yes"
indent="no"/>
<xsl:template match="/">
<xsl:text>INSERT INTO tblObjects</xsl:text>
<xsl:text>(ObjectID, Title, TMid, Material, ObjectType, Height) VALUES (</xsl:text>
<xsl:apply-templates select="root"/>
<xsl:text>);</xsl:text>
</xsl:template>
<xsl:template match="root">
<xsl:value-of select="TEI/teiHeader/fileDesc/titleStmt/title"/>
</xsl:template>
</xsl:stylesheet>
INSERT INTO tblObjects(ObjectID, Title, TMid, Material, ObjectType, Height) VALUES ();
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:doc="http://www.tei-c.org/ns/1.0">
<xsl:output method="text" encoding="UTF-8" omit-xml-declaration="yes" indent="no"/>
<xsl:template match="/doc:TEI">
<xsl:text>INSERT INTO tblObjects</xsl:text>
<xsl:text>(ObjectID, Title, TMid, Material, ObjectType, Height)
VALUES
</xsl:text>
<xsl:apply-templates select="doc:teiHeader/doc:fileDesc/doc:sourceDesc/doc:msDesc/doc:physDesc"/>
</xsl:template>
<xsl:template match="doc:physDesc">
<xsl:variable name="quote">'</xsl:variable>
<xsl:value-of select="concat('(',
$quote, ancestor::doc:fileDesc/doc:titleStmt/doc:title, $quote, ', ',
ancestor::doc:fileDesc/doc:publicationStmt/doc:idno[@type='TM'], ', ',
$quote, normalize-space(descendant::doc:material), $quote, ', ',
$quote, normalize-space(descendant::doc:objectType), $quote, ', ',
descendant::doc:dimensions/doc:height,
')'
)"/>
</xsl:template>
</xsl:stylesheet>