XSLT将XML转换为列表

时间:2018-08-13 13:07:04

标签: xml xslt

下面是我的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>

1 个答案:

答案 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:choosexsl:if相比,使用xsl:apply-templatesxsl:template match通常会导致更复杂的代码。 if语句通常是过程编程的标志,而不是模板编程的标志。使用模板匹配时,条件表示为match属性(例如@name='Symbol')的一部分。