Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用XML文件数据创建SQL INSERT语句_Sql_Xml_Xslt - Fatal编程技术网

使用XML文件数据创建SQL INSERT语句

使用XML文件数据创建SQL INSERT语句,sql,xml,xslt,Sql,Xml,Xslt,我想使用XSLT从XML文件中编码的数据生成SQLINSERT语句 例如,我的XML文件包括以下标记(描述墓碑): 我最初的问题(现已解决)是: 在找到一些示例后,我尝试将输出方法设置为text 联机,但这给了我错误消息“非空白” “xs:appinfo”以外的架构元素中不允许使用字符 和“xs:documentation” 我将文件格式更改为xsl,现在它不再抱怨非空白字符。我现在可以将文本放入最终输出。以下(受您的回答启发)是我的XSLT的当前状态,现在我只想尝试插入标题的值,其位置是“TE

我想使用XSLT从XML文件中编码的数据生成SQLINSERT语句

例如,我的XML文件包括以下标记(描述墓碑):

我最初的问题(现已解决)是:

在找到一些示例后,我尝试将输出方法设置为text 联机,但这给了我错误消息“非空白” “xs:appinfo”以外的架构元素中不允许使用字符 和“xs:documentation”

我将文件格式更改为xsl,现在它不再抱怨非空白字符。我现在可以将文本放入最终输出。以下(受您的回答启发)是我的XSLT的当前状态,现在我只想尝试插入标题的值,其位置是“TEI/teiHeader/fileDesc/titlesmt/title”:


但是,正如您所看到的,它没有插入标题的值。我不知道为什么这不起作用(现在只尝试标题)。

只需使用模板沿着树走下去,并用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)&#xa;VALUES&#xa;</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">&apos;</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)&#xa;VALUES&#xa;</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">&apos;</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>