Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.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 基本XSLT的问题_Xml_Xslt - Fatal编程技术网

Xml 基本XSLT的问题

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 />

我对使用XSLT非常陌生,我正在尝试将基本XML文件转换为SQL以插入数据库

我正在尝试转换:

<?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">