Преобразование xml в html с помощью XSLT

Я знаю, что это легко, но я пытался, и XSLT действительно непонятен для меня... Вот почему я хотел бы иметь пример поверх моего кода, чтобы я мог изучить его на реальном примере и, вероятно, понять его.

Итак, у меня есть приложение с древовидным представлением графического интерфейса и генерирующим мне XML такого рода:

<TreeView>
  <Parent text="Installation">
    <child text="Startup" type="video" file="startup.wmv" icon="c://user/desktop/blahblah.jpg"/>
    <child text="Getting there" type="video" file="gettingthere.wmv" icontPath="something"/>
    <child text="Steps" type="document" file="steps.docx" icon="asd"/>
    <child text="Pictures" type="image" file="pics.jpg" icon="dasdasdas"/>
  </Parent>
  <Parent text="Usage">
    <child text="Tilbud pane" type="video" file="tilbud.mwv" icon="asdasd"/>
    <child text="Report pane" type="document" file="report.docx" icon="gfdhd"/>
  </Parent>
</TreeView>

Затем мне нужно преобразовать этот XML в HTML, чтобы я мог обновить его на своем веб-сайте.

Так что мне не нужны теги <html> и <body>. Мне нужно просто упорядочить этот XML в список, тогда как перед дочерними элементами должен быть пробел.

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

Installation
  Startup
  Getting there
  Steps
  Pictures
Usage
  Tilbud pane
  Report pane

Но поскольку у меня не будет одинаковых значений в атрибутах, я должен упорядочить элементы.

Вот что у меня есть:

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

и желаемый html, который я должен получить, выглядит примерно так:

<ul>
    <li>Parent
         <ul>
               <li>Child</li>
               <li>Child</li>
 .....
         </ul>
    </li>
   <li>Parent
         <ul>
               <li>Child</li>
               <li>Child</li>
 .....
         </ul>
   </li>
.....
</ul>

но видимо он не хочет мне это давать... Он мне даёт просто <ul/> после того как я запустил трансформацию...


person Syspect    schedule 19.08.2013    source источник
comment
Аналогично stackoverflow. ком/вопросы/3839730/   -  person fred02138    schedule 19.08.2013


Ответы (2)


Вот таблица стилей, которая выполняет преобразование:

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

    <xsl:output method="html" encoding="utf-8"/>

    <xsl:template match="/">
        <ul>
        <xsl:apply-templates/>
        </ul>
    </xsl:template>

    <xsl:template match="Parent">
        <li>
        <xsl:value-of select="@text"/>
        <br/>
        <ul>
            <xsl:apply-templates select="child"/>
        </ul>
        </li>
    </xsl:template>

    <xsl:template match="child">
        <li><xsl:value-of select="@text"/></li>
    </xsl:template>

</xsl:stylesheet>

Если вы просто хотите вывести текст:

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

    <xsl:output method="text" encoding="utf-8"/>

    <xsl:template match="Parent">
        <xsl:value-of select="@text"/>
        <xsl:text>&#xa;  </xsl:text>
        <xsl:apply-templates select="child"/>
    </xsl:template>

    <xsl:template match="child">
        <xsl:text>  </xsl:text>
        <xsl:value-of select="@text"/>
        <xsl:text>&#xa;  </xsl:text>
    </xsl:template>

</xsl:stylesheet>
person fred02138    schedule 19.08.2013
comment
Таким образом, правильный способ сделать это: создать шаблон для каждой вещи, которую я хочу сопоставить, а затем вызвать apply-templates? - person Syspect; 20.08.2013

Ваш XSLT не работает, потому что он ищет Parent непосредственно в /, но между ними есть TreeView.

<xsl:template match="/TreeView">
   ...
person Jens Teich    schedule 19.08.2013
comment
Вы были правы в этом, но я все еще не получаю детей в выводе. Я понимаю только родителей. - person Syspect; 20.08.2013