Ваша основная проблема, основанная на предоставленном коде XML и XSLT, заключается в том, что ваш код вообще не учитывает тот факт, что элементы в документе XML находятся в пространстве имен по умолчанию .
Как обрабатывать XML-документ с пространством имен по умолчанию - это часто задаваемые вопросы - просто выполните поиск по тегам xslt и xpath, и вы найдете множество хороших ответов.
Вот одно из возможных решений :
Это преобразование :
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:x="http://notreal.org/ns1"
exclude-result-prefixes="x">
<xsl:output method="xml" omit-xml-declaration="yes" indent="yes"/>
<xsl:template match="/*">
<html>
<head>
<title>User</title>
</head>
<body>
<p>Detailed Addresses</p>
<table>
<thead>
<xsl:apply-templates select="x:address/@type"/>
</thead>
<tr>
<xsl:apply-templates select="x:address/x:street"/>
</tr>
<tr>
<xsl:apply-templates select="x:address/x:city"/>
</tr>
</table>
</body>
</html>
</xsl:template>
<xsl:template match="@type">
<th><xsl:value-of select="."/></th>
</xsl:template>
<xsl:template match="x:address/*">
<td><xsl:value-of select="."/></td>
</xsl:template>
</xsl:stylesheet>
при применении к полному и правильно сформированному документу XML, который включает фрагмент XML, представленный в вопросе :
<user xmlns="http://notreal.org/ns1"
xmlns:poi="http://notreal2.org/ns2">
<address type="primary">
<street>1031 Court St.</street>
<city>Monhegan, NY</city>
</address>
<address type="secondary">
<street>203 Elm St.</street>
<city>Pittsburgh, PA</city>
</address>
</user>
дает (что кажется) желаемый, правильный результат :
<html>
<head>
<title>User</title>
</head>
<body>
<p>Detailed Addresses</p>
<table>
<thead>
<th>primary</th>
<th>secondary</th>
</thead>
<tr>
<td>1031 Court St.</td>
<td>203 Elm St.</td>
</tr>
<tr>
<td>Monhegan, NY</td>
<td>Pittsburgh, PA</td>
</tr>
</table>
</body>
</html>