2011-01-06 24 views
3

我對XSL相當陌生,需要幫助解決轉換問題。我有一個由XSD描述的XML文件。我使用XSL文件將XML轉換爲HTML。我想在XML文件中引用XSD,但是當我這樣做時,XML不會被轉換。在xml中引用xsd時出現xsl轉換問題

例XML:

<?xml version="1.0" encoding="UTF-8"?> 
<?xml-stylesheet type="text/xsl" href="example.xsl"?> 

<root> 
<!-- 
<root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://localhost" xsi:schemaLocation="http://localhost example.xsd"> 
--> 
    <element>Element 1</element> 
    <element>Element 2</element> 
    <element>Element 3</element> 
</root> 

例XSL:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
    <xsl:template match="/"> 
    <ul> 
     <xsl:for-each select="root/element"> 
     <li><xsl:value-of select="."/></li> 
     </xsl:for-each> 
    </ul> 
    </xsl:template> 
</xsl:stylesheet> 

例XSD:

<?xml version="1.0" encoding="UTF-8"?> 
<xs:schema 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    targetNamespace="http://localhost" 
    xmlns="http://localhost" 
    elementFormDefault="qualified"> 
    <xs:element name="root"> 
    <xs:complexType> 
     <xs:sequence> 
     <xs:element name="element" type="xs:string" minOccurs="0" maxOccurs="unbounded"/> 
     </xs:sequence> 
    </xs:complexType> 
    </xs:element> 
</xs:schema> 

在XML中,如果我使用註釋了根標籤,Firefox和鉻不要轉換xml。如果我只是使用<根標記,那麼轉換髮生得很好。

任何人都可以解釋爲什麼XSL轉換不會發生,如果我在我的XML參考XSD?任何幫助表示讚賞!

+0

好問題,+1。請參閱我的答案以獲得解釋和完整解:) – 2011-01-06 03:21:59

+0

除了@Dimitre正確的答案,請注意,定義一個模式爲空(或空)名稱空間URI – 2011-01-06 15:21:52

+0

正確指出。謝謝! – Jpnh 2011-01-06 19:30:31

回答

8
<!-- <root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://localhost" xsi:schemaLocation="http://localhost example.xsd"> --> 

這與使用XML Schema無關。問題是你指定一個默認名稱空間

對默認名稱空間中的節點名稱使用XPath表達式是最大的XPath FAQ。

請在xpath和xslt標籤中搜索「default namespace」,您會發現很多好的答案。

XSLT的解決方案是聲明一個帶有某些前綴(稱爲「x」)的命名空間,並且命名空間uri與XML文檔中默認命名空間的命名空間uri相同。然後在任何XPath表達式中使用x:name而不是name

因此,你的XSLT代碼變得

<root xmlns="http://localhost" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://localhost example.xsd"> 
    <element>Element 1</element> 
    <element>Element 2</element> 
    <element>Element 3</element> 
</root> 

有用,正確的結果產生

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:x="http://localhost" exclude-result-prefixes="x" > 

    <xsl:template match="/"> 
     <ul> 
      <xsl:for-each select="x:root/x:element"> 
       <li> 
        <xsl:value-of select="."/> 
       </li> 
      </xsl:for-each> 
     </ul> 
    </xsl:template> 
</xsl:stylesheet> 

,並且當所提供的XML文檔與未註釋<root>元件施加:

<ul> 
    <li>Element 1</li> 
    <li>Element 2</li> 
    <li>Element 3</li> 
</ul> 
+0

感謝您的詳細和有益的答案!一旦我有足夠的聲望,我會給它一個+1 – Jpnh 2011-01-06 18:43:08