2015-08-25 2 views
0

У меня очень странный эффект при добавлении schemaLocation в мой xml-файл.xslt transform xsd validated xml

Проблема:

При добавлении xsi:schemaLocation="Projekt.xsd" в корневой элемент моего файла XML, преобразование XSLT больше не работает. Когда я не укажу xsd-файл, преобразование работает, и данные отображаются, но , как только я добавляю xsd-файл, данные больше не отображаются.

  • Что мне не хватает, так что данные по-прежнему получать отображаются и преобразованы правильно после добавления XSD-файл в SchemaLocation?

Информация:Все файлы находятся в той же папке


XML

<?xml version="1.0" encoding="UTF-8"?> 
<?xml-stylesheet type="text/xsl" href="Projekt.xsl"?> 
<school xmlns="http://www.w3schools.com" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="Projekt.xsd"> 
    <personen> 
     <person id="1"> 
      <name>A</name> 
      <kuerzel>a</kuerzel> 
      <email>[email protected]</email> 
     </person> 
     <person id="2"> 
      <name>B</name> 
      <kuerzel>b</kuerzel> 
      <email>[email protected]</email> 
     </person> 
     <person id="3"> 
      <name>C</name> 
      <kuerzel>C</kuerzel> 
      <email>[email protected]</email> 
     </person> 
    </personen> 
</school> 

XSD

<?xml version="1.0"?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 
targetNamespace="http://www.w3schools.com" 
xmlns="http://www.w3schools.com" 
elementFormDefault="qualified"> 

<xs:element name="school"> 
    <xs:complexType> 
    <xs:sequence> 
     <xs:element name="personen" maxOccurs="unbounded"> 
      <xs:complexType> 
       <xs:choice minOccurs="0" maxOccurs="unbounded"> 
        <xs:sequence> 
        <xs:element name="person"> 
         <xs:complexType> 
          <xs:sequence>   
           <xs:element name="name" type="xs:string"/> 
           <xs:element name="kuerzel" type="xs:string"/> 
           <xs:element name="email" type="xs:string"/> 
          </xs:sequence> 
          <xs:attribute name="id" type="xs:integer" /> 
         </xs:complexType> 
        </xs:element> 
       </xs:sequence> 
       </xs:choice> 
      </xs:complexType> 

     </xs:element> 
    </xs:sequence> 
    </xs:complexType> 
</xs:element> 
</xs:schema> 

XSLT

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

<xsl:template match="/"> 
    <html> 
    <body> 
    <h2>School</h2> 
    <table border="1"> 
     <tr bgcolor="#9acd32"> 
     <th style="text-align:left">Name</th> 
     <th style="text-align:left">Kürzel</th> 
     <th style="text-align:left">Email</th> 
     <th style="text-align:left">Image</th> 
     </tr> 
     <xsl:for-each select="school/personen/person"> 
     <tr> 
     <td><xsl:value-of select="name"/></td> 
     <td><xsl:value-of select="kuerzel"/></td> 
     <td><a href="mailto:{email}"><xsl:value-of select="email" /></a></td> 
     <td><img src="http://tempUri.com/{kuerzel}.jpg" width="100px" height="100px"/></td> 
     </tr> 
     </xsl:for-each> 
    </table> 
    </body> 
    </html> 
</xsl:template> 
</xsl:stylesheet> 

Кто-нибудь есть идея, что это неправильно в моих файлах?

ответ

1

schemaLocation не имеет значения, но ваш образец ввода имеет объявление пространства имен по умолчанию xmlns="http://www.w3schools.com" на корневом элементе, который помещает все элементы в это пространство имен. Однако XSLT использует такие пути, как school/personen/person, которые (в XSLT/XPath 1.0) выбирают элементы без пространства имен. Либо перейдите к процессору XSLT 2.0, где затем вы можете определить xpath-default-namespace="http://www.w3schools.com" в своей таблице стилей или, если вы хотите решить его с помощью XSLT 1.0, объявите xmlns:df="http://www.w3schools.com" в таблице стилей и адаптируйте свои пути, чтобы использовать этот префикс, как в df:school/df:personen/df:person, так и df:name и так далее.