2015-04-12 3 views
0

У меня есть следующий XML-файл:Серьезное печать из преобразования XSL

<?xml version="1.0" encoding="UTF-8"?> 
<?xml-stylesheet type="text/css" href="university_students.css" ?> 
<university> 
    <students> 
     <student sid="sckl9999"> 
      <name>Schmitt</name> 
      <firstname>Klaus</firstname> 
      <courses> 
       <course cid="IM120"> 
        <grade attempt="1" term="WS13" type="simple">4.7</grade> 
         <grade attempt="2" term="SS14" type="simple">5.0</grade> 
          <grade attempt="3" term="WS14" type="simple">1.3</grade> 
       </course> 
       <course cid="IM130"> 
        <grade attempt="1" term="SS14" type="complex">2.1</grade> 
         <course cid="IM131"> 
          <grade attempt="1" term="WS14" type="simple">2.2</grade> 
         </course> 
         <course cid="IM132"> 
          <grade attempt="1" term="SS14" type="simple">2.3</grade> 
         </course> 
         <course cid="IM133"> 
          <grade attempt="1" term="WS14" type="simple">2.0</grade> 
         </course> 
       </course> 
       <course cid="IM140"> 
        <grade attempt="1" term="WS14" type="simple">1.7</grade> 
       </course> 
      </courses> 
     </student> 
     <student sid="sckl9999"> 
      <name>Putin</name> 
      <firstname>Wladimir</firstname> 
      <courses> 
       <course cid="IM120"> 
        <grade attempt="1" term="WS14" type="simple">1.7</grade> 
       </course> 
       <course cid="IM130"> 
        <grade attempt="1" term="SS14" type="complex">2.3</grade> 
        <course cid="IM131"> 
         <grade attempt="2" term="WS14" type="simple">2.3</grade> 
        </course> 
        <course cid="IM132"> 
         <grade attempt="1" term="SS14" type="simple">2.7</grade> 
        </course> 
        <course cid="IM133"> 
         <grade attempt="1" term="WS14" type="simple">2.7</grade> 
        </course> 
       </course> 
       <course cid="IM140"> 
        <grade attempt="1" term="WS14" type="simple">1.7</grade> 
       </course> 
      </courses> 
     </student> 
     <student sid="sckl9999"> 
      <name>Merkel</name> 
      <firstname>Angela</firstname> 
      <courses> 
       <course cid="IM120"> 
        <grade attempt="1" term="SS14" type="simple">1.0</grade> 
       </course> 
       <course cid="IM130"> 
        <grade attempt="1" term="SS14" type="complex">1.1</grade> 
        <course cid="IM131"> 
         <grade attempt="1" term="WS14" type="simple">1.3</grade> 
        </course> 
        <course cid="IM132"> 
         <grade attempt="1" term="SS14" type="simple">2.3</grade> 
        </course> 
        <course cid="IM133"> 
         <grade attempt="1" term="WS14" type="simple">1.3</grade> 
        </course> 
       </course> 
       <course cid="IM140"> 
        <grade attempt="1" term="WS14" type="simple">2.0</grade> 
       </course> 
      </courses> 
     </student> 
    </students> 
</university> 

И follwoing XSLT в файл:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    exclude-result-prefixes="xs" 
    version="2.0"> 
    <xsl:template match="/"> 
     <html> 
      <body> 
       <h2>Following errors were found:</h2> 
       <xsl:apply-templates/> 
      </body> 
     </html> 
    </xsl:template> 

    <xsl:template match="grade[@type='simple']"> 
      <xsl:if test="not(.='1.0' or .='1.3' or .='1.7' or .='2.0' or .='2.3' or .='2.7' or .='3.0' or .='3.3' or .='3.7' or .='4.0' or .='4.3' or .='4.7' or .='5.0')"> 
       <h3> 
        Simple grade <xsl:value-of select="."/> not correct in course <xsl:value-of select="../@cid" /> under term <xsl:value-of select="@term" /> at attempt <xsl:value-of select="@attempt" />. 
       </h3> 
      </xsl:if> 
    </xsl:template> 
</xsl:stylesheet> 

Этот XSLT должен проверить для любого класса в файле XML до он имеет тип «простой», а затем он должен проверять значение, если оно соответствует утверждению if. Моя проблема в том, что я получаю следующий результат:

Following errors were found: 
Schmitt Klaus 2.1 
Simple grade 2.2 not correct in course IM131 under term WS14 at attempt 1. 
Putin Wladimir 2.3 Merkel Angela 1.1 

Третья строка это то, что мне нужно, но почему есть еще вторая и четвертая строка, я действительно не нужен? Я сделал ошибку, и вы можете исправить ее?

Заранее спасибо.

ответ

2

Поскольку вы, кажется, обеспокоены писать «серьезный» XSLT, вы должны также

  • всегда выводится буквальное содержание текста внутри xsl:text для того, чтобы всегда быть в управлении, какие символы записываются в выходное дерево
  • возможно поместить все допустимые значения класса в переменную и сохранить их как последовательность
  • как уже предложено leu, добавьте пустой шаблон, соответствующий text(), чтобы переусердствовать е встроенный шаблон
  • явно указать метод html вывода, а также использовать strip-space, чтобы избавиться от всех пробельных только текстовых узлов

таблицы стилей XSLT

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

    <xsl:output method="html" indent="yes"/> 
    <xsl:strip-space elements="*"/> 

    <xsl:template match="/"> 
     <html> 
      <body> 
       <h2>Following errors were found:</h2> 
       <xsl:apply-templates/> 
      </body> 
     </html> 
    </xsl:template> 

    <xsl:template match="grade[@type='simple']"> 

      <xsl:variable name="allowed-grades" select="('1.0','1.3','1.7','2.0','2.3','2.7','3.0','3.3','3.7','4.0','4.3','4.7','5.0')"/> 

      <xsl:if test="not(string(.) = $allowed-grades)"> 
       <h3> 
        <xsl:text>Simple grade </xsl:text> 
        <xsl:value-of select="."/> 
        <xsl:text> not correct in course </xsl:text> 
        <xsl:value-of select="../@cid" /> 
        <xsl:text> under term </xsl:text> 
        <xsl:value-of select="@term" /> 
        <xsl:text> at attempt </xsl:text> 
        <xsl:value-of select="@attempt" /> 
        <xsl:text>.</xsl:text> 
       </h3> 
      </xsl:if> 
    </xsl:template> 

    <xsl:template match="text()"/> 
</xsl:stylesheet> 

HTML Output

<html> 
    <body> 
     <h2>Following errors were found:</h2> 
     <h3>Simple grade 2.2 not correct in course IM131 under term WS14 at attempt 1.</h3> 
    </body> 
</html> 

Несвязанный, но «были найдены следующие ошибки:« На мой взгляд, не является грамматическим английским предложением. Вам нужно будет использовать «. были найдены следующие ошибки:«.

1

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

Зная это, мы можем легко избежать тех строк, которые вы не хотите. Просто добавьте этот шаблон

<xsl:template match="text()"/> 
Смежные вопросы