我有这个 XML:
<XmlTreff IsSub="false" Start="false" Stop="false">
<Id>Id0</Id>
<Tittel>Title0</Tittel>
</XmlTreff>
<XmlTreff IsSub="false" Start="false" Stop="false">
<Id>Id1</Id>
<Tittel>Title1</Tittel>
</XmlTreff>
<XmlTreff IsSub="true" Start="true" Stop="false">
<Id>Id2</Id>
<Tittel>Title2</Tittel>
</XmlTreff>
<XmlTreff IsSub="true" Start="false" Stop="false">
<Id>Id3</Id>
<Tittel>Title3</Tittel>
</XmlTreff>
<XmlTreff IsSub="true" Start="false" Stop="true">
<Id>Id4</Id>
<Tittel>Title4</Tittel>
</XmlTreff>
<XmlTreff IsSub="false" Start="false" Stop="false">
<Id>Id5</Id>
<Tittel>Title5</Tittel>
</XmlTreff>
此 XML 已使用 XSLT 进行转换,并应生成此 HTML
<html>
<body>
<div>
<div>
<a href="doesntmatter">Title0</a>
</div>
<div>
<a href="doesntmatter">Title1</a>
</div>
<ul>
<li>
<a href="doesntmatter">Title2</a>
</li>
<li>
<a href="doesntmatter">Title3</a>
</li>
<li>
<a href="doesntmatter">Title4</a>
</li>
</ul>
<div>
<a href="doesntmatter">Title5</a>
</div>
</div>
</body>
</html>
当时的想法是属性 Start、Stop 和 IsSub 控制标签的打开和关闭。
目前我有这个 XSLT:
<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/XmlSokeResultat/Treff">
<html xmlns="http://www.w3.org/1999/xhtml" lang="no" xml:lang="no">
<body>
<xsl:for-each select="XmlTreff">
<div class="XmlTreffinfo">
<xsl:if test="@IsSub = 'false'">
<div>
<div>
<xsl:element name="a">
<xsl:value-of select="Tittel"/>
</xsl:element>
</div>
</div>
</xsl:if>
<xsl:if test="@Start = 'true'">
<div>
<ul>
</xsl:if>
<xsl:if test="@IsSub = 'true'">
<ul>
<li>
<a>
<xsl:value-of select="."/>
</a>
</li>
</ul>
</xsl:if>
<xsl:if test="@Stop = 'true'">
</ul>
</div>
</xsl:if>
</div>
</xsl:for-each>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
问题是不允许在语法错误的地方使用开始和结束标签。你知道如何解决这个问题吗?(请参阅 ifs 内部,其中起始 div 和 ul 放置在与结束标签不同的位置)
编辑:我可以向 XML 添加和删除属性,但元素结构必须是这样的吗?
EDIT2:我尝试使用 concat 和 value-of 呈现 HTML 标签
<xsl:value-of disable-output-escaping="yes" select="concat('<', '/ul', '>')" />
<xsl:value-of disable-output-escaping="yes" select="concat('<', '/div', '>')" />
有趣的是,IE10 可以处理这个问题,但 Firefox 无法正确呈现它。