XSLT转换考虑子节点不具有节点值

时间:2018-08-28 07:48:24

标签: html xml xslt

下面是我的XML,它包含在节点下面。

<richtext >
<par def="3">
    paragraph value 1
    <run>
        <font style="underline" />run value 1
    </run>.
    paragraph value 2
    <run>
        <font style="underline" />run value 2
    </run>
    paragraph value 3
    <run>
        <font style="underline" />run value 2 <br /> run value on new line
    </run> 
   paragraph value 4
</par>
</richtext>

我正在使用下面的xslt将上面的xml转换为html。我是xslt的新手,请帮助我。

 <xsl:template match="/">
  <div>
  <xsl:apply-templates select="richtext" />
</div>

<xsl:template name="richtext">
<xsl:apply-templates select="par" />
<xsl:apply-templates select="table" />

<xsl:template match="par">
<p>
  <xsl:if test="text()">
    <xsl:value-of disable-output-escaping="yes" select="text()" />
    <xsl:value-of disable-output-escaping="yes" select="*/following-sibling::text()" />
  </xsl:if>
  <xsl:if test="run">
    <xsl:apply-templates select="run" />
    <xsl:value-of disable-output-escaping="yes" select="run/following-sibling::text()" />
  </xsl:if>

</p>

<xsl:template match="run">
<span>
  <xsl:call-template name="style" />
  <xsl:value-of disable-output-escaping="yes" select="current()" />

</span>

我想在html输出下面

<p>
    paragraph value 1
    <span style="underline">
        run value 1
    </span>.
    paragraph value 2
    <span style="underline">
        run value 2 <br /> run value on new line
    </span>
    paragraph value 3
    <span style="underline">
        run value 2
    </span> 

   paragraph value 4
</p>

请查看更新的HTML输出。你能告诉我该怎么办吗?我想从xml保留样式。 编辑:如果我们在XML中添加
,那么我要在HTML的新行中
之后的文本。

1 个答案:

答案 0 :(得分:1)

您似乎想执行以下操作:

  1. richtext转换为div
  2. par转换为p
  3. run转换为span
  4. font转换为属性

在这种情况下,应使用一系列简单的模板来完成。

尝试使用此XSLT

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="html" indent="yes" />

<xsl:template match="@*|node()">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
</xsl:template>

<xsl:template match="richtext">
  <div>
     <xsl:apply-templates select="par|table" />
   </div>
</xsl:template>

<xsl:template match="par">
  <p>
    <xsl:apply-templates />  
  </p>
</xsl:template>

<xsl:template match="run">
  <span>
    <xsl:call-template name="style" />
    <xsl:apply-templates />  
  </span>
</xsl:template>

<xsl:template match="font" />

<xsl:template name="style">
  <xsl:attribute name="style">
    <xsl:for-each select="font">
      <xsl:if test="position() > 1">; </xsl:if>
      <xsl:value-of select="@style" />
    </xsl:for-each>
  </xsl:attribute>
</xsl:template>

</xsl:stylesheet>

请注意,此处实际上不需要匹配“字体”的模板。由于示例中的font元素没有子元素,因此您可以省略模板,因为内置模板将跳过该模板,并且不输出任何内容。