Xml 基本XSLT的问题
我对使用XSLT非常陌生,我正在尝试将基本XML文件转换为SQL以插入数据库 我正在尝试转换:Xml 基本XSLT的问题,xml,xslt,Xml,Xslt,我对使用XSLT非常陌生,我正在尝试将基本XML文件转换为SQL以插入数据库 我正在尝试转换: <?xml version="1.0" standalone="yes"?> <DataStore xmlns="Microsystems.D3.DataEngine"> <DDA_Atoms> <ID>22d2e980-f13b-43be-83a8-4b72cd38c053</ID> <CONTENT />
<?xml version="1.0" standalone="yes"?>
<DataStore xmlns="Microsystems.D3.DataEngine">
<DDA_Atoms>
<ID>22d2e980-f13b-43be-83a8-4b72cd38c053</ID>
<CONTENT />
<NAME>name 1</NAME>
<PREVIEW>preview 1</PREVIEW>
<STRUCTURE_ELEMENT_ID>1</STRUCTURE_ELEMENT_ID>
<HASH>-2013036173</HASH>
<PATH>C:\dir1</PATH>
<SIZE>88331</SIZE>
</DDA_Atoms>
<DDA_Atoms>
<ID>4a1b0532-db0c-4790-9e71-92f6d84b4ad2</ID>
<CONTENT />
<NAME>Name 2</NAME>
<PREVIEW>preview 2</PREVIEW>
<STRUCTURE_ELEMENT_ID>2</STRUCTURE_ELEMENT_ID>
<HASH>-1467957647</HASH>
<PATH>C:\dir2</PATH>
<SIZE>220557</SIZE>
</DDA_Atoms>
</DataStore>
我假设我的模板匹配“缺少”了它们的目标或其他东西。我做错了什么?问题在于XML中的名称空间声明
<DataStore xmlns="Microsystems.D3.DataEngine">
这意味着该元素及其所有子元素都属于该名称空间。但是,XSLT中没有对名称空间的引用,因此所有xpath表达式都在查找没有名称空间的元素,并且与XML不匹配。您之所以获得文本输出,仅仅是因为将使用XSLT的内置模板,而这些模板将在找到任何文本节点的地方输出文本节点
您需要做的是首先在XSLT中声明名称空间,并使用名称空间前缀
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"
xmlns:da="Microsystems.D3.DataEngine">
然后,无论在哪里引用元素,都需要使用名称空间前缀作为前缀。例如:
<xsl:template match="da:DataStore">
试试这个XSLT
<?xml version="1.0" encoding="iso-8859-1"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" xmlns:da="Microsystems.D3.DataEngine">
<xsl:output method="text" encoding="iso-8859-1"/>
<xsl:template match="da:DataStore">
<xsl:apply-templates/>
</xsl:template>
<xsl:template match="da:DDA_Atoms">
<xsl:text>INSERT INTO DDA_Atoms VALUES ('</xsl:text >
<xsl:value-of select="da:ID"/>
<xsl:text>', '</xsl:text>
<xsl:value-of select="da:CONTENT"/>
<xsl:text>', '</xsl:text>
<xsl:value-of select="da:NAME"/>
<xsl:text>', '</xsl:text>
<xsl:value-of select="da:PREVIEW"/>
<xsl:text>', </xsl:text>
<xsl:value-of select="da:STRUCTURE_ELEMENT_ID"/>
<xsl:text>, </xsl:text>
<xsl:value-of select="da:HASH"/>
<xsl:text>, '</xsl:text>
<xsl:value-of select="da:PATH"/>
<xsl:text>', </xsl:text>
<xsl:value-of select="da:SIZE"/>
<xsl:text>)</xsl:text>
</xsl:template>
</xsl:stylesheet>
插入DDA_原子值('
', '
', '
', '
',
,
, '
',
)
还请注意,第二个模板中不需要
,因为您已经在处理所有子项了
注意:如果您使用的是XSLT2.0,那么可以使用“xpath默认名称空间”选项来声明默认名称空间。这样,您就不必更改任何模板来使用名称空间前缀,因为XSLT会假定任何没有前缀的模板都在这个默认名称空间中(而不是不在名称空间中)
非常好。非常感谢你的帮助。
<xsl:template match="da:DataStore">
<?xml version="1.0" encoding="iso-8859-1"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" xmlns:da="Microsystems.D3.DataEngine">
<xsl:output method="text" encoding="iso-8859-1"/>
<xsl:template match="da:DataStore">
<xsl:apply-templates/>
</xsl:template>
<xsl:template match="da:DDA_Atoms">
<xsl:text>INSERT INTO DDA_Atoms VALUES ('</xsl:text >
<xsl:value-of select="da:ID"/>
<xsl:text>', '</xsl:text>
<xsl:value-of select="da:CONTENT"/>
<xsl:text>', '</xsl:text>
<xsl:value-of select="da:NAME"/>
<xsl:text>', '</xsl:text>
<xsl:value-of select="da:PREVIEW"/>
<xsl:text>', </xsl:text>
<xsl:value-of select="da:STRUCTURE_ELEMENT_ID"/>
<xsl:text>, </xsl:text>
<xsl:value-of select="da:HASH"/>
<xsl:text>, '</xsl:text>
<xsl:value-of select="da:PATH"/>
<xsl:text>', </xsl:text>
<xsl:value-of select="da:SIZE"/>
<xsl:text>)</xsl:text>
</xsl:template>
</xsl:stylesheet>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"
xpath-default-namespace="Microsystems.D3.DataEngine">