下面是我的XML
<par def="1">
<run>
<font name="Symbol" pitch="variable" truetype="true" familyid="10" />· </run>
<run>
<font name="Calibri" pitch="variable" truetype="true" familyid="20" />abc</run>
</par>
我想在列表中显示以上数据。 下面是我的XSLT
<xsl:template match="run">
<xsl:choose>
<xsl:when test="@name='Symbol'">
<xsl:for-each select="ancestor::item">
<span>
<xsl:call-template name="style" />
<xsl:value-of select="current()" />
<xsl:if test="table">
<xsl:apply-templates select="table" />
</xsl:if>
</span>
</xsl:for-each>
</xsl:when>
<xsl:otherwise>
<p>
<span>
<xsl:call-template name="style" />
<xsl:value-of select="current()" />
<xsl:if test="table">
<xsl:apply-templates select="table" />
</xsl:if>
</span>
</p>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
它不起作用。所有par def都转换为不在列表中的段落。
我想要以HTML格式输出,如下所示
<ul>
<li>abc </li>
</ul>
答案 0 :(得分:0)
给出:
<?xml version="1.0"?>
<par def="1">
<run>
<font name="Symbol" pitch="variable" truetype="true" familyid="10" />· </run>
<run>
<font name="Calibri" pitch="variable" truetype="true" familyid="20" />abc</run>
</par>
使用以下方法进行转换
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" encoding="utf-8" indent="yes" omit-xml-declaration="yes"/>
<xsl:strip-space elements="*" />
<xsl:template match="/">
<ul><xsl:apply-templates /></ul>
</xsl:template>
<!-- Remove any "font" elements with a symbol. -->
<xsl:template match="*[font[@name='Symbol']]"></xsl:template>
<xsl:template match="text()">
<li><xsl:value-of select="normalize-space(.)" /></li>
</xsl:template>
</xsl:stylesheet>
产生:
<ul>
<li>abc</li>
</ul>
与使用xsl:choose
和xsl:if
相比,使用xsl:apply-templates
或xsl:template match
通常会导致更复杂的代码。 if
语句通常是过程编程的标志,而不是模板编程的标志。使用模板匹配时,条件表示为match
属性(例如@name='Symbol'
)的一部分。