Вам нужно создать правило, соответствующее «/», или XSL будет неявно создавать его для вас на основе преобразования текста в текст документа.
Я бы переписал XSL так:
<xsl:stylesheet
version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:aws="http://webservices.amazon.com/AWSECommerceService/2006-06-07">
<xsl:output method="html" encoding="UTF-8" omit-xml-declaration="yes"/>
<xsl:template match="/">
<html>
<head>...</head>
<body>
<table>
<thead>...</thead>
<tbody>
<xsl:apply-templates select="//aws:Item"/>
</tbody>
</table>
</body>
</html>
</xsl:template>
<xsl:template match="aws:Item">
<tr>
<td>...</td>
</tr>
</xsl:template>
</xsl:stylesheet>
ИЛИ добавьте этот шаблон в существующий xsl
<xsl:template match="*|@*">
<xsl:apply-templates select="*|@*"/>
</xsl:template>
Оба шаблона будут соответствовать корневому каталогу документа ("/"), который является ЕДИНСТВЕННЫМ неявным соответствием, которое делает XSL. Это сначала заставит "/" отобразить тег html, который создаст таблицу, в которой каждая строка таблицы будет отображена в aws: item. Второй будет соответствовать всем узлам (и атрибутам), ничего не выводить, а затем попытаться сопоставить все дочерние элементы. Первое лучше, если вы хотите обрабатывать только aws: Item, второе лучше, если вы хотите обработать все узлы. Второе может (в зависимости от функций оптимизации вашего процессора xslt и вашего конкретного документа xslt) обрабатываться гораздо дольше.