2011-01-06 3 views
3

Я довольно новичок в XSL и нуждаюсь в помощи с проблемой трансформации. У меня есть XML-файл, который описывается XSD. Я использую XSL-файл для преобразования XML в HTML. Я хочу ссылаться на XSD в XML-файле, но когда я делаю XML, он не преобразуется.Проблема преобразования xsl при ссылке xsd в xml

Пример 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 и Chrome не преобразуйте xml. Если я просто использую простой < корень > тег, однако преобразование происходит нормально.

Может ли кто-нибудь объяснить, почему преобразование XSL не происходит, если я ссылаюсь на XSD в своем XML? Любая помощь приветствуется!

+0

Хороший вопрос, +1. См. Мой ответ для объяснения и полного решения. :) –

+0

Кроме того, @Dimitre правильный ответ, обратите внимание, что можно определить схему для элементов под нулевым (или пустым) пространством имен URI –

+0

Соответственно. Благодаря! – Jpnh

ответ

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

Это не имеет никакого отношения к использованию схемы XML. Проблема в том, что вы указываете пространство имен по умолчанию.

Использование выражений XPath для имен узлов в пространстве имен по умолчанию - это самый большой запрос XPath.

Пожалуйста, найдите теги xpath и xslt для «пространства имен по умолчанию», и вы найдете много хороших ответов.

Раствор для XSLT это объявить пространство имен с некоторым префиксом (скажем, «х») и пространство имен-Ури, который так же, как пространство имен-URI пространства имен по умолчанию в документе XML. Затем в любом выражении XPath используйте x:name вместо name.

Таким образом, ваш код XSLT становится:

<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> элементом:

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

разыскиваемый, правильный результат производством :

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

Благодарим вас за подробный и полезный ответ! Я дам ему +1, если у меня хватит репутации – Jpnh

Смежные вопросы