Справка XSLT и XML — не генерируется html с двумя разными элементами XML

#xml #xslt #dom #xml-parsing

#xml #xslt #dom #xml-синтаксический анализ

Вопрос:

У меня возникла проблема с объединением моих XSLT и XML в определенной ситуации, и я застрял, ниже приведен пример моей проблемы:

XML:

 <a>
<x>
    <y testname="test1">
      <object elementname="Name" elementvalue="true" elementvalue1="ABC" elementvalue2="ADF">
        <comparisonresult>false</comparisonresult>
      </object>
     </y>

</x>
</a>
  

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>
        <font face="Arial">
        <h2>HEADINGY</h2>
        <h4>Process 1</h4>
        <h4>More Process</h4>
            <h4>Additional </h4>
              <table border="1">
              <tr bgcolor="#dccdc">
                <th align="center">T1</th>
                <th align="center">T2</th>
                <th align="center">T3</th>
              </tr>
              </table>
          <h2>Main</h2>
          <xsl:for-each select="a/x/y">
            <h3>
              <xsl:value-of select="@testname" />
            </h3>
            <h4>Heading 1</h4>
            <table border="1" style="display:inline">
              <tr bgcolor="#CECEF6">
                <th align="center">Item1</th>
                <th align="center">Item2</th>
                <th align="center">Item3</th>
              </tr>
              <xsl:for-each select="object">
                <tr>
                  <td bgcolor="#F2F5A9">
                    <xsl:value-of select="@elementname" />
                  </td>
                  <td bgcolor="#F2F5A9">
                    <xsl:value-of select="@elementvalue1" />
                  </td>
                  <td bgcolor="#F2F5A9">
                    <xsl:value-of select="@elementvalue2" />
                  </td>

                </tr>
              </xsl:for-each>
            </table>
          </xsl:for-each>
        </font>
      </body>
    </html>
  </xsl:template>
</xsl:stylesheet>
  

Если вы введете эти два в http://www.w3schools.com/xml/tryxslt.asp?xmlfile=simpleamp;xsltfile=simple вы получаете выходные данные, как ожидалось. Проблема возникает, когда я добавил следующее в XML, поэтому это выглядит как:

 <a>
<x>
    <y testname="test1">
      <object elementname="Name" elementvalue="true" elementvalue1="ABC" elementvalue2="ADF">
        <comparisonresult>false</comparisonresult>
      </comparisonobject>
</y>
<x>

 <t testname="ComparisonResult">
    <step stepname="Add x" stepresult="Add x">
      <result>true</result>
    </step>
</t>



</a>
  

и соответствующий 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>
        <font face="Arial">
        <h2>HEADINGY</h2>
        <h4>Process 1</h4>
        <h4>More Process</h4>
          <xsl:for-each select="a/x/t">
             <xsl:for-each select="testname">
            <h4>Additional </h4>
              <table border="1">
              <tr bgcolor="#dccdc">
                <th align="center">T1</th>
                <th align="center">T2</th>
                <th align="center">T3</th>
              </tr>

 <xsl:for-each select="stepname">
                <tr>
                  <td bgcolor="#F2F5A9">
                    <xsl:value-of select="@stepname" />
                  </td>
                  <td bgcolor="#F2F5A9">
                    <xsl:value-of select="@step result" />
                  </td>
                  <td bgcolor="#F2F5A9">
                    <xsl:value-of select="@result" />
                  </td>
              </table>
          <h2>Main</h2>
          <xsl:for-each select="a/x/y">
            <h3>
              <xsl:value-of select="@testname" />
            </h3>
            <h4>Heading 1</h4>
            <table border="1" style="display:inline">
              <tr bgcolor="#CECEF6">
                <th align="center">Item1</th>
                <th align="center">Item2</th>
                <th align="center">Item3</th>
              </tr>
              <xsl:for-each select="object">
                <tr>
                  <td bgcolor="#F2F5A9">
                    <xsl:value-of select="@elementname" />
                  </td>
                  <td bgcolor="#F2F5A9">
                    <xsl:value-of select="@elementvalue1" />
                  </td>
                  <td bgcolor="#F2F5A9">
                    <xsl:value-of select="@elementvalue2" />
                  </td>

                </tr>
              </xsl:for-each>
            </table>
          </xsl:for-each>
        </font>
      </body>
    </html>
  </xsl:template>
</xsl:stylesheet>
  

Я просто получаю пустую страницу.
Я знаю, что здесь многое нужно переварить, но я действительно застрял!

Спасибо

Комментарии:

1. Ваша таблица стилей неправильно сформирована…

2. Ваш xml также неправильно сформирован. Сделайте так, чтобы ваши теги x и y совпадали.

3. Я вижу ошибку в XML, но не уверен в XSLT, где я ошибаюсь..

Ответ №1:

Ваша <xsl:for-each select="a/x/t"> структура документа не соответствует вашей структуре документа — так и должно быть <xsl:for-each select="a/t"> … но ваши вложенные for-each несут дополнительные проблемы.

То, чего вы пытаетесь достичь, лучше сделать с использованием шаблонов. Я добавлю пример позже.