Проблема преобразования xsl при обращении к xsd в xml - PullRequest
4 голосов
/ 06 января 2011

Я довольно новичок в XSL и мне нужна помощь с проблемой преобразования.У меня есть файл XML, который описывается XSD.Я использую файл XSL для преобразования XML в HTML.Я хочу сослаться на XSD в файле XML, но когда я это сделаю, 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?Любая помощь приветствуется!

1 Ответ

9 голосов
/ 06 января 2011
<!-- <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 состоит в том, чтобы объявить пространство имен с некоторым префиксом (скажем, «x») и namespace-uri, которое совпадает с name-space-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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...