2013-10-08 69 views
0

我對使用XSLT非常陌生,我試圖將一個基本的XML文件轉換爲SQL以便插入到數據庫中。基本XSLT故障

我試圖改變:

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

使用以下XSL:

<?xml version="1.0" encoding="iso-8859-1"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
<xsl:output method="text" encoding="iso-8859-1"/> 
<xsl:template match="DataStore"> 
    <xsl:apply-templates/> 
</xsl:template> 

<xsl:template match="DDA_Atoms"> 
    <xsl:text>INSERT INTO DDA_Atoms VALUES ('</xsl:text > 
     <xsl:value-of select="ID"/> 
     <xsl:text>', '</xsl:text> 
     <xsl:value-of select="CONTENT"/> 
     <xsl:text>', '</xsl:text> 
     <xsl:value-of select="NAME"/> 
     <xsl:text>', '</xsl:text> 
     <xsl:value-of select="PREVIEW"/> 
     <xsl:text>', </xsl:text> 
     <xsl:value-of select="STRUCTURE_ELEMENT_ID"/> 
     <xsl:text>, </xsl:text> 
     <xsl:value-of select="HASH"/> 
     <xsl:text>, '</xsl:text> 
     <xsl:value-of select="PATH"/> 
     <xsl:text>', </xsl:text> 
     <xsl:value-of select="SIZE"/> 
     <xsl:text>)</xsl:text> 
    <xsl:apply-templates/> 
</xsl:template> 
</xsl:stylesheet> 

但是當我運行對XML的XSL它與節點的公正價值和回來不是字面的SQL文本。更重要的是,它實際上忽略了所有的XSL,因爲當我刪除所有的模板匹配代碼並且基本上留下一個空的XSL文檔時,轉換完成了同樣的事情:僅返回節點的所有值,如:

22d2e980-f13b-43be-83a8-4b72cd38c053name 1preview 11-2013036173C:\dir1883314a1b0532-db0c-4790-9e71-92f6d84b4ad2Name 2preview 22-1467957647C:\dir2220557 

我想我的模板匹配的「丟失」他們的目標什麼的。我究竟做錯了什麼?

回答

2

的問題是因爲在你的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> 

還要注意有沒有必要在第二模板<xsl:apply-templates/>,因爲你已經處理所有的孩子呢。

注意:如果您使用的是XSLT 2.0,則可以使用「xpath-default-namespace」選項來聲明默認名稱空間。然後,您不必更改任何模板來使用名稱空間前綴,因爲XSLT會假定沒有前綴的任何前綴都位於此默認名稱空間中(而不是在沒有名稱空間中)。

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" 
       xpath-default-namespace="Microsystems.D3.DataEngine"> 
+0

優秀。非常感謝您的幫助。 – CodingUnderDuress