使用XSLT从XML生成SQL INSERT语句时无法提取title值的问题
解决XSLT无法提取TEI XML中title值的问题
我来帮你排查这个问题,你遇到的VALUES部分为空的情况,主要是两个核心原因:XML命名空间未处理和模板匹配逻辑错误,下面给你详细分析和修正方案:
问题根源分析
- 命名空间遗漏:你的TEI XML文档里声明了命名空间
xmlns="http://www.tei-c.org/ns/1.0",这意味着所有元素都属于这个命名空间,但你的XSLT里没有声明和使用这个命名空间,导致XPath表达式根本找不到对应的元素。 - 模板匹配错误:你的XSLT里写了
match="root",但你的XML根节点是<TEI>,根本不存在root节点,同时apply-templates select="root"也完全匹配不到任何内容,所以输出自然是空的。
修正后的XSLT代码
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:tei="http://www.tei-c.org/ns/1.0"> <!-- 声明TEI命名空间并绑定前缀tei --> <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> <!-- 提取title值,注意使用tei前缀 --> <xsl:text>'</xsl:text> <xsl:value-of select="tei:TEI/tei:teiHeader/tei:fileDesc/tei:titleStmt/tei:title"/> <xsl:text>'</xsl:text> <!-- 这里你可以继续添加其他字段的提取,比如TMid、Material等,同样用tei前缀 --> <xsl:text>);</xsl:text> </xsl:template> </xsl:stylesheet>
补充说明
如果需要提取其他字段(比如TMid、Material、尺寸等),只需要按照同样的方式,用tei:前缀定位元素即可,比如提取TMid可以用:
<xsl:value-of select="tei:TEI/tei:teiHeader/tei:fileDesc/tei:publicationStmt/tei:idno[@type='TM']"/>
记得给字符串类型的字段加上单引号,符合SQL语法要求。
测试输出
用你提供的示例XML测试,会得到如下正确的INSERT语句:
INSERT INTO tblObjects(ObjectID, Title, TMid, Material, ObjectType, Height) VALUES ('Funerary inscription for Marcellus, a smith');
内容的提问来源于stack exchange,提问作者user11621274
相关产品推荐
相关产品推荐

