2014-02-06 39 views
0

我已閱讀了關於此主題的其他幾個問題,根據我在網站上其他地方閱讀的答案,我認爲我正確地做了這件事,但它仍然沒有完成,工作。XSLT和默認命名空間的問題

我有一個XHTML文件,我已經通過JTidy運行並運行XPath以從該XHTML中選擇單個表節點。這一切工作正常,和XPath能夠選擇表就好了,它返回的XML下面的代碼片段:

<table xmlns="http://www.w3.org/1999/xhtml" align="left" border="1" cellpadding="3" cellspacing="3" id="ctl07_tblMain" rules="rows" style="border-color:Green; border-style:solid; border-width:1px;" summary="Table is for layout purpose only"> 
    <tr> 
    <th class="GridViewHeader" colspan="19" style="font-weight:bold; text-align:center">Select an arrival date 
to continue.</th> 
    </tr> 
    <tr class="altCampArea"> 
    <td align="center" width="400">Site Type</td> 
    <td align="center"> Pet </td> 
    <td align="center">Electric</td> 
    <td align="center">Water</td> 
    <td align="center">Sewer</td> 
    <td align="center" title="Friday, 02/07/2014" width="20"> 
     <a href="#" onclick="javascript:closeAndRedirect(&quot;2/7/2014&quot;,&quot;SearchCriteria.aspx&quot;); return false;">02/07</a> 
    </td> 
    <td align="center" title="Saturday, 02/08/2014" width="20"> 
     <a href="#" onclick="javascript:closeAndRedirect(&quot;2/8/2014&quot;,&quot;SearchCriteria.aspx&quot;); return false;">02/08</a> 
    </td> 
    <td align="center" title="Sunday, 02/09/2014" width="20"> 
     <a href="#" onclick="javascript:closeAndRedirect(&quot;2/9/2014&quot;,&quot;SearchCriteria.aspx&quot;); return false;">02/09</a> 
    </td> 
    <td align="center" title="Monday, 02/10/2014" width="20"> 
     <a href="#" onclick="javascript:closeAndRedirect(&quot;2/10/2014&quot;,&quot;SearchCriteria.aspx&quot;); return false;">02/10</a> 
    </td> 
    <td align="center" title="Tuesday, 02/11/2014" width="20"> 
     <a href="#" onclick="javascript:closeAndRedirect(&quot;2/11/2014&quot;,&quot;SearchCriteria.aspx&quot;); return false;">02/11</a> 
    </td> 
    <td align="center" title="Wednesday, 02/12/2014" width="20"> 
     <a href="#" onclick="javascript:closeAndRedirect(&quot;2/12/2014&quot;,&quot;SearchCriteria.aspx&quot;); return false;">02/12</a> 
    </td> 
    <td align="center" title="Thursday, 02/13/2014" width="20"> 
     <a href="#" onclick="javascript:closeAndRedirect(&quot;2/13/2014&quot;,&quot;SearchCriteria.aspx&quot;); return false;">02/13</a> 
    </td> 
    <td align="center" title="Friday, 02/14/2014" width="20"> 
     <a href="#" onclick="javascript:closeAndRedirect(&quot;2/14/2014&quot;,&quot;SearchCriteria.aspx&quot;); return false;">02/14</a> 
    </td> 
    <td align="center" title="Saturday, 02/15/2014" width="20"> 
     <a href="#" onclick="javascript:closeAndRedirect(&quot;2/15/2014&quot;,&quot;SearchCriteria.aspx&quot;); return false;">02/15</a> 
    </td> 
    <td align="center" title="Sunday, 02/16/2014" width="20"> 
     <a href="#" onclick="javascript:closeAndRedirect(&quot;2/16/2014&quot;,&quot;SearchCriteria.aspx&quot;); return false;">02/16</a> 
    </td> 
    <td align="center" title="Monday, 02/17/2014" width="20"> 
     <a href="#" onclick="javascript:closeAndRedirect(&quot;2/17/2014&quot;,&quot;SearchCriteria.aspx&quot;); return false;">02/17</a> 
    </td> 
    <td align="center" title="Tuesday, 02/18/2014" width="20"> 
     <a href="#" onclick="javascript:closeAndRedirect(&quot;2/18/2014&quot;,&quot;SearchCriteria.aspx&quot;); return false;">02/18</a> 
    </td> 
    <td align="center" title="Wednesday, 02/19/2014" width="20"> 
     <a href="#" onclick="javascript:closeAndRedirect(&quot;2/19/2014&quot;,&quot;SearchCriteria.aspx&quot;); return false;">02/19</a> 
    </td> 
    <td align="center" title="Thursday, 02/20/2014" width="20"> 
     <a href="#" onclick="javascript:closeAndRedirect(&quot;2/20/2014&quot;,&quot;SearchCriteria.aspx&quot;); return false;">02/20</a> 
    </td> 
    </tr> 
    <tr> 
    <td align="left" width="400">CEDAR GROVE-WATER ONLY CAMPSITE</td> 
    <td align="center">Yes</td> 
    <td align="center">No</td> 
    <td align="center">Yes</td> 
    <td align="center">No</td> 
    <td align="center">11</td> 
    <td align="center">11</td> 
    <td align="center">11</td> 
    <td align="center">11</td> 
    <td align="center">11</td> 
    <td align="center">11</td> 
    <td align="center">11</td> 
    <td align="center">11</td> 
    <td align="center">11</td> 
    <td align="center">11</td> 
    <td align="center">11</td> 
    <td align="center">11</td> 
    <td align="center">11</td> 
    <td align="center">11</td> 
    </tr> 
    <tr class="altCampArea"> 
    <td align="left" width="400">LARGE TRAILER AREA-ELECTRIC &amp; 
WATER CAMPSITE 50AMP</td> 
    <td align="center">Yes</td> 
    <td align="center">Yes</td> 
    <td align="center">Yes</td> 
    <td align="center">No</td> 
    <td align="center">12</td> 
    <td align="center">12</td> 
    <td align="center">12</td> 
    <td align="center">12</td> 
    <td align="center">12</td> 
    <td align="center">12</td> 
    <td align="center">11</td> 
    <td align="center">9</td> 
    <td align="center">9</td> 
    <td align="center">10</td> 
    <td align="center">13</td> 
    <td align="center">13</td> 
    <td align="center">13</td> 
    <td align="center">13</td> 
    </tr> 
    <tr> 
    <td align="left" width="400">LARGE TRAILER 
AREA-SEWER,ELECT&amp;WATER HOST 50AMP</td> 
    <td align="center">Yes</td> 
    <td align="center">Yes</td> 
    <td align="center">Yes</td> 
    <td align="center">Yes</td> 
    <td align="center">0</td> 
    <td align="center">0</td> 
    <td align="center">0</td> 
    <td align="center">0</td> 
    <td align="center">0</td> 
    <td align="center">0</td> 
    <td align="center">0</td> 
    <td align="center">0</td> 
    <td align="center">0</td> 
    <td align="center">0</td> 
    <td align="center">0</td> 
    <td align="center">0</td> 
    <td align="center">0</td> 
    <td align="center">0</td> 
    </tr> 
    <tr class="altCampArea"> 
    <td align="left" width="400">OAK GROVE-SEWER,ELECT&amp;WATER 
30AMP</td> 
    <td align="center">Yes</td> 
    <td align="center">Yes</td> 
    <td align="center">Yes</td> 
    <td align="center">Yes</td> 
    <td align="center">2</td> 
    <td align="center">3</td> 
    <td align="center">3</td> 
    <td align="center">3</td> 
    <td align="center">3</td> 
    <td align="center">3</td> 
    <td align="center">3</td> 
    <td align="center">0</td> 
    <td align="center">0</td> 
    <td align="center">0</td> 
    <td align="center">2</td> 
    <td align="center">2</td> 
    <td align="center">2</td> 
    <td align="center">3</td> 
    </tr> 
    <tr> 
    <td align="left" width="400">PECAN GROVE-ELECTRIC &amp; WATER 
CAMPSITE 20FT 50AMP</td> 
    <td align="center">Yes</td> 
    <td align="center">Yes</td> 
    <td align="center">Yes</td> 
    <td align="center">No</td> 
    <td align="center">8</td> 
    <td align="center">8</td> 
    <td align="center">9</td> 
    <td align="center">9</td> 
    <td align="center">9</td> 
    <td align="center">9</td> 
    <td align="center">9</td> 
    <td align="center">9</td> 
    <td align="center">9</td> 
    <td align="center">9</td> 
    <td align="center">9</td> 
    <td align="center">9</td> 
    <td align="center">9</td> 
    <td align="center">9</td> 
    </tr> 
    <tr class="altCampArea"> 
    <td align="left" width="400">PECAN GROVE-ELECTRIC &amp; WATER 
CAMPSITE 25FT 50AMP</td> 
    <td align="center">Yes</td> 
    <td align="center">Yes</td> 
    <td align="center">Yes</td> 
    <td align="center">No</td> 
    <td align="center">10</td> 
    <td align="center">10</td> 
    <td align="center">10</td> 
    <td align="center">10</td> 
    <td align="center">10</td> 
    <td align="center">10</td> 
    <td align="center">10</td> 
    <td align="center">10</td> 
    <td align="center">10</td> 
    <td align="center">10</td> 
    <td align="center">10</td> 
    <td align="center">10</td> 
    <td align="center">10</td> 
    <td align="center">10</td> 
    </tr> 
    <tr> 
    <td align="left" width="400">PECAN GROVE-ELECTRIC &amp; WATER TENT 
ONLY 50AMP</td> 
    <td align="center">Yes</td> 
    <td align="center">Yes</td> 
    <td align="center">Yes</td> 
    <td align="center">No</td> 
    <td align="center">0</td> 
    <td align="center">0</td> 
    <td align="center">0</td> 
    <td align="center">0</td> 
    <td align="center">0</td> 
    <td align="center">0</td> 
    <td align="center">0</td> 
    <td align="center">0</td> 
    <td align="center">0</td> 
    <td align="center">0</td> 
    <td align="center">0</td> 
    <td align="center">0</td> 
    <td align="center">0</td> 
    <td align="center">0</td> 
    </tr> 
    <tr class="altCampArea"> 
    <td align="left" width="400">PECAN GROVE-SEWER,ELECT&amp;WATER HOST 
50AMP</td> 
    <td align="center">Yes</td> 
    <td align="center">Yes</td> 
    <td align="center">Yes</td> 
    <td align="center">Yes</td> 
    <td align="center">0</td> 
    <td align="center">0</td> 
    <td align="center">0</td> 
    <td align="center">0</td> 
    <td align="center">0</td> 
    <td align="center">0</td> 
    <td align="center">0</td> 
    <td align="center">0</td> 
    <td align="center">0</td> 
    <td align="center">0</td> 
    <td align="center">0</td> 
    <td align="center">0</td> 
    <td align="center">0</td> 
    <td align="center">0</td> 
    </tr> 
    <tr> 
    <td align="left" width="400">WAGON CIRCLE-GROUP TRAILER AREA 
50AMP</td> 
    <td align="center">Yes</td> 
    <td align="center">Yes</td> 
    <td align="center">Yes</td> 
    <td align="center">No</td> 
    <td align="center">35</td> 
    <td align="center">35</td> 
    <td align="center">35</td> 
    <td align="center">35</td> 
    <td align="center">35</td> 
    <td align="center">35</td> 
    <td align="center">35</td> 
    <td align="center">35</td> 
    <td align="center">35</td> 
    <td align="center">35</td> 
    <td align="center">35</td> 
    <td align="center">35</td> 
    <td align="center">35</td> 
    <td align="center">35</td> 
    </tr> 
    <tr class="altCampArea"> 
    <td align="left" width="400">WAGON CIRCLE-SEWER,ELECT&amp;WATER 
PREMIUM 50AMP</td> 
    <td align="center">Yes</td> 
    <td align="center">Yes</td> 
    <td align="center">Yes</td> 
    <td align="center">Yes</td> 
    <td align="center">0</td> 
    <td align="center">0</td> 
    <td align="center">0</td> 
    <td align="center">0</td> 
    <td align="center">0</td> 
    <td align="center">0</td> 
    <td align="center">0</td> 
    <td align="center">0</td> 
    <td align="center">0</td> 
    <td align="center">0</td> 
    <td align="center">0</td> 
    <td align="center">0</td> 
    <td align="center">0</td> 
    <td align="center">0</td> 
    </tr> 
</table> 

然後我嘗試過程中使用此XSLT是:

<xslt:stylesheet xmlns:xslt="http://www.w3.org/1999/XSL/Transform" xmlns:csw-xform="http://www.compositesw.com/2003/xform" xmlns:ns1="http://www.w3.org/1999/xhtml" xmlns:xs="http://www.w3.org/2001/XMLSchema" version="2.0"> 
    <xslt:template match="/"> 
    <xslt:variable name="_value"/> 
    <xslt:element name="results"> 
     <xslt:for-each select="ns1:table"> 
     <xslt:for-each select="ns1:tr"> 
      <xslt:for-each select="ns1:td"> 
      <xslt:variable name="_value" select="normalize-space(.)"/> 
      <xslt:element name="result"> 
       <xslt:element name="value"> 
       <xslt:value-of select="$_value"/> 
       </xslt:element> 
      </xslt:element> 
      </xslt:for-each> 
     </xslt:for-each> 
     </xslt:for-each> 
    </xslt:element> 
    </xslt:template> 
</xslt:stylesheet> 

但得到的XSLT的輸出就是:

<results/> 

我懷疑這是一個命名空間的問題,但據我可以告訴命名空間被在XSLT正確處理。輸入XML中的默認名稱空間在XSLT中定義爲「ns1」,並在該XSLT中的每個XPath表達式中使用。所以我不知道我錯過了什麼。

編輯2014-02-09:原來是我用來運行XSLT的軟件平臺中的一個錯誤。上面粘貼的XML片段實際上只是一個大文檔中的表格。爲了獲取表格,我首先調用XPATH,如下所示:

DECLARE myXML LONGVARCHAR; 
DECLARE myOutXML XML; 
SET outXml = XPATH(myOutXML, '//*[@id=''ctl07_tblMain'']'); 

'outXml'被送入XSLT的位置。我不得不將其更改爲這使其工作:

SET myOutXML = CAST(XPATH(myOutXML, '//*[@id=''ctl07_tblMain'']') AS LONGVARCHAR); 
SET outXml = myOutXML; 

出於某種原因,從鑄造到XML的LONGVARCHAR XPATH的結果,然後返回回作爲XML解決了這一問題。

+0

作爲Lingamurthy CS節目,你的代碼看起來不錯。所以也許我們需要看看你是如何運行它的。 –

+0

是的,這是我運行XSLT的軟件平臺中的一個錯誤。上面粘貼的XML片段實際上只是一個大文檔中的表格。爲了只抓住表格,我首先調用XPATH,如下所示: SET outXml = XPATH(myOutXML,'// * [@ id =''ctl07_tblMain'''''; – irwinr

回答

0

令你驚訝的是,我得到了輸入XML和XSLT的輸出。類似這樣的:

<results> 
<result> 
    <value>Site Type</value> 
</result> 
<result> 
    <value>Pet</value> 
</result> 
<result> 
    <value>Electric</value> 
</result> 
..... 
+0

原來你是對的,XSLT確實有效。問題最終成爲我用來執行XSLT的軟件平臺中的一個錯誤。感謝您指出。 – irwinr

0

這實際上並不涉及名稱空間,因爲它看起來像它們都被正確地聲明和引用。

但是,我很驚訝你運行XSLT時實際上並沒有收到錯誤,因爲你有兩個模板中相同變量名的變量聲明。首先...

<xslt:variable name="_value"/> 

後來......

<xslt:variable name="_value" select="normalize-space(.)"/> 

這實際上不是在同一個模板允許的。如果您沒有意識到,XSLT中的變量是「不可變的」,這意味着一旦定義它們就不能更改。而且,你不需要'聲明'它們,並且稍後'初始化'它們。

http://www.w3.org/TR/1999/PR-xslt-19991008#local-variables閱讀了關於它說:「這是,如果一個具有約束力的一個XSL建立了一個錯誤:變量或XSL:在模板中param元素遮蓋另一個具有約束力的一個xsl成立:變量或XSL:param元素也在模板內

我懷疑發生的事情是您的XSLT處理器沒有通知您錯誤,而只是不執行錯誤發生的代碼塊。嘗試刪除第一個變量聲明(實際上將_value設置爲空字符串)。

話雖如此,你的XSLT可以有所簡化。你不需要巢所有的xsl:for-每個語句,但是它們組合成一個

<xslt:for-each select="ns1:table/ns1:tr/ns1:td"/> 

甚至這個...

<xslt:for-each select=".//ns1:td"/> 

更妙的是,使用模板匹配!

<xslt:apply-templates select=".//ns1:td"/> 

其實,你並不需要在所有here.Try這個XSLT聲明任何變量....

<xslt:stylesheet xmlns:xslt="http://www.w3.org/1999/XSL/Transform" xmlns:csw-xform="http://www.compositesw.com/2003/xform" xmlns:ns1="http://www.w3.org/1999/xhtml" xmlns:xs="http://www.w3.org/2001/XMLSchema" version="2.0"> 
    <xslt:template match="/"> 
    <xslt:element name="results"> 
     <xslt:apply-templates select=".//ns1:td"/> 
    </xslt:element> 
    </xslt:template> 

    <xslt:template match="ns1:td"> 
     <xslt:element name="result"> 
     <xslt:element name="value"> 
     <xslt:value-of select="normalize-space(.)"/> 
     </xslt:element> 
    </xslt:element> 
    </xslt:template> 
</xslt:stylesheet>