これは、実際に探しているXSLT1.0変換です。
トリックを使わずに、整形式のHTMLのネストされたツリーを作成しますdisable-output-escaping
。
<xsl:stylesheet
version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
>
<xsl:output method="html" indent="yes" />
<!-- index Nodes by their owner ID -->
<xsl:key name="kNodeByOwnerId" match="Node" use="Prp[@name = 'owner id']/@value" />
<xsl:template match="/">
<html>
<head>
<style type="text/css"><![CDATA[
body {
font-size: 14px;
font-family: verdana;
background-color: white;
}
div.root {
padding: 0px 0px 2px 0px;
}
div.root div {
padding: 0px 0px 0px 0px;
margin-left: 3em;
}
div.remark {
margin-left: 2em;
}
img.icon {
padding-right: 5px;
}
span.log {
font-weight: bold;
}
span.log.fail {
color: red;
}
span.log.pass {
color: green;
}
span.log.info {
color: blue;
}
]]></style>
</head>
<body>
<!-- output "top level" nodes, i.e. those with owner ID -1 -->
<xsl:apply-templates select="key('kNodeByOwnerId', '-1')">
<xsl:sort select="substring-after(@name, 'message ')" data-type="number" />
<xsl:with-param name="containerClass" select="'root'" />
</xsl:apply-templates>
</body>
</html>
</xsl:template>
<xsl:template match="Node">
<xsl:param name="containerClass" select="''" />
<xsl:variable name="messageClass">
<xsl:apply-templates select="Prp[@name = 'type']" />
</xsl:variable>
<div class="{$containerClass}">
<img class="icon" src="./{$messageClass}.png" />
<span class="log {$messageClass}">
<xsl:value-of select="Prp[@name='message']/@value"/>
</span>
<xsl:apply-templates select="Prp[@name = 'remarks']" />
<!-- output nodes that belong to this node (recursive!) -->
<xsl:apply-templates select="key('kNodeByOwnerId', Prp[@name = 'id']/@value)">
<xsl:sort select="substring-after(@name, 'message ')" data-type="number" />
</xsl:apply-templates>
</div>
</xsl:template>
<xsl:template match="Prp[@name = 'remarks']">
<xsl:if test="normalize-space(@value) != ''">
<div class="remark">
<img class="icon" src="./info.png" />
<xsl:value-of select="@value"/>
</div>
</xsl:if>
</xsl:template>
<xsl:template match="Prp[@name = 'type']">
<xsl:choose>
<xsl:when test="@value = '0'">pass</xsl:when>
<xsl:when test="@value = '4'">info</xsl:when>
<xsl:otherwise>fail</xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>
の使用に注意してください<xsl:key>
。キーがどのように機能するかについての完全な説明は、私の以前の回答にあります。
コードは非常に単純なので、コードの機能を理解するのにほとんど問題はありません。不明な点がないか、遠慮なくお尋ねください。
CSSコードを別のファイルに入れることを強くお勧めします。