#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
несут дополнительные проблемы.
То, чего вы пытаетесь достичь, лучше сделать с использованием шаблонов. Я добавлю пример позже.