2009-08-23 50 views
4

我試圖獲取使用轉換的xml文檔的根元素的信息列表。我無法弄清的部分是:使用xsl/xpath查找xmlns

如何獲取默認名稱空間url?

如何獲取每個xmlns前綴及其相關url的列表?

這裏是我的xml文件:

<?xml version="1.0" encoding="UTF-8"?> 
<?xml-stylesheet type="text/xsl" href="/example.xsl"?> 
<foo:mytag xmlns="http://default.example.com/" 
      xmlns:foo="http://foo.example.com/" 
      xmlns:bar="http://bar.example.com"> 
</foo:mytag> 

這裏是我的XSL文件:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output 
    doctype-public="-//W3C//DTD XHTML 1.1//EN" 
    doctype-system="http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd" 
    encoding="UTF-8" 
    indent="yes" 
    method="xml" 
    omit-xml-declaration="no" 
    version="1.0" /> 

    <xsl:template match="/"> 
     <html xmlns="http://www.w3.org/1999/xhtml"> 
      <head> 
       <title></title> 
      </head> 
      <body> 
       default namespace - <b>???</b><br /> 
       full tag name - <b><xsl:value-of select="name(*)"/></b><br /> 
       xmlns for tag - <b><xsl:value-of select="namespace-uri(*)"/></b><br /> 
       tag prefix - <b>???</b><br /> 
       tag name - <b><xsl:value-of select="local-name(*)"/></b><br /> 
       List of xmlns - <br /> 
       ???? 
      </body> 
     </html> 
</xsl:template> 

這種轉變是在瀏覽器正在做。基本上我期待的結果如下:

default namespace - http://default.example.com/ 
full tag name - foo:mytag 
xmlns for tag - http://foo.example.com/ 
tag prefix - foo 
tag name - mytag 
List of xmlns - 
     - http://default.example.com/ 
    foo - http://foo.example.com/ 
    bar - http://bar.example.com/ 

我是否缺少明顯的東西來填補缺失的數據?

+0

你想達到什麼目的?想要知道與節點相關聯的命名空間更常見,而不是僅僅需要命名空間聲明列表。 – 2009-08-23 18:00:53

回答

5

我認爲這大致上是你想要的。 XSLT 1.0 - 在XMLSpy中測試

<xsl:template match="/"> 
    <html xmlns="http://www.w3.org/1999/xhtml"> 
     <head> 
      <title></title> 
     </head> 
     <body> 
      default namespace - <b><xsl:value-of select="*/namespace::*[not (name())]"/></b><br /> 
      full tag name - <b><xsl:value-of select="name(*)"/></b><br /> 
      xmlns for tag - <b><xsl:value-of select="namespace-uri(*)"/></b><br /> 
      tag prefix - <b><xsl:value-of select="substring-before(name(*),':')" /></b><br /> 
      tag name - <b><xsl:value-of select="local-name(*)"/></b><br /> 
      List of xmlns - <br /> 
      <xsl:for-each select="*/namespace::*"> 
       <xsl:if test="not (name() = 'xml')"><xsl:text> 
        </xsl:text> 
        <xsl:value-of select="name()" /><xsl:text> - </xsl:text><xsl:value-of select="." /><br /> 
       </xsl:if> 
      </xsl:for-each> 
     </body> 
    </html> 
</xsl:template>