2011-12-05 179 views
0

我正在使用XSL從自動生成的XML文件創建報告。在該文件中,我的根節點將時間戳記作爲名稱空間。當我生成帶有XML文件中包含時間戳的HTML報告時,我無法在節點中獲取屬性。當我刪除它時,它工作正常。有人可以在這個話題上談一點點。謝謝。XML XSL命名空間

與時間戳:

<AdminReports xmlns="30/11/2011 09:25:58"> 

<?xml version="1.0" encoding="ISO-8859-1"?><!DOCTYPE AdminReports []> 
<?xml-stylesheet type="text/xsl" href="AdminReport.xsl"?> 

<AdminReports xmlns="30/11/2011 09:25:58"> 
    <AdminReport ID="1"> 
    </AdminReport > 
</AdminReports> 

回答

0

因爲命名空間URI的默認命名空間是一個時間戳 - 這意味着它是每一個自動生成的文件可能不同,沒有辦法定義在XSLT代碼「本」的命名空間。

存在着另一種方式 - 不是直接使用前綴的名字,但他們比較的元素的name()

/*/*[name()='AdminReport']/@ID 

正確選擇名爲「AdminReport」(regardles任何元素的ID屬性它屬於哪個名稱空間),這是XML文檔頂部元素的子元素。

下面是一個完整XSLT例子

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="text"/> 

<xsl:template match="/"> 
    <xsl:value-of select= 
    "/*/*[name()='AdminReport']/@ID"/> 
</xsl:template> 
</xsl:stylesheet> 

當這個變換所提供的XML文檔施加:

<AdminReports xmlns="30/11/2011 09:25:58"> 
    <AdminReport ID="1"> 
    </AdminReport > 
</AdminReports> 

有用,correst結果產生

1 
+0

謝謝Dimitre !!!這工作完美!你能否提請我進一步閱讀關於這個話題和我可能遇到的其他挑戰。 – NewUser101

+0

@ NewUser101:不客氣。 Michael Kay和Jeni Tennison的書都是很好的閱讀。在這裏看到我的建議:http://stackoverflow.com/questions/339930/any-good-xslt-tutorial-book-blog-site-online/341589#341589 –

0

,此值不應該存儲在xmlns,但你可以namespace-uri()訪問了XPath 2.0:

namespace-uri(/*:AdminReports) 
+0

我真的不需要訪問它。我抓取來自不同屬性的信息,當它位於xml文件中時,它阻止我訪問它。 – NewUser101

+0

@ NewUser101 - 啊......你正在處理的是一個默認的命名空間。關於這個話題有很多問題/答案。我會盡力找到一些。 –

+0

謝謝。那太好了! – NewUser101

0

xmlns="..."不是一個屬性的聲明,但是一個名稱空間聲明。這意味着元素AdminReports位於名稱空間中。

我認爲在您的XSL中,沒有對應於以下URI「30/11/2011 09:25:58」的命名空間聲明。因此,XSL不會給你預期的結果。如果您在刪除名稱空間聲明後獲得了良好的結果,那麼這意味着您的XSL適用於沒有名稱空間的XML。

在轉換之前,可以添加第一個XSL來刪除名稱空間。例如:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    version="1.0"> 
    <xsl:template match="*"> 
     <xsl:element name="{local-name()}"> 
      <xsl:for-each select="@*"> 
       <xsl:attribute name="{local-name()}" > 
        <xsl:value-of select="."/> 
       </xsl:attribute> 
      </xsl:for-each> 
      <xsl:apply-templates/> 
     </xsl:element> 
    </xsl:template>  
</xsl:stylesheet> 

另一種方法是更改​​您的XSL,使其變爲「可識別名稱空間」。

+0

我如何使它名稱空間感知? – NewUser101

+0

如果你的命名空間是固定的,你可以添加'xsl:xpath-default-namespace'屬性和固定的命名空間(但它只適用於xslt 2.0)。如果你的命名空間經常變化,也許並不那麼容易,而且可能是改變你的xsl,這樣它就會忽略命名空間,但代碼不容易維護(例如,替代'match =「elt」',寫' match =「* [local-name()='elt']」') –