使用XSL解析XML内部的标记

时间:2013-10-31 13:16:18

标签: html xml xslt

我有一个像这样的xml:

<node>
    <par>
        Lorem ipsum dolor <bold>sit</bold> amet, consectetur adipiscing elit.
    <par>
</node>

我必须打印一个这样的HTML:

<p>
    <span>Lorem ipsum dolor</span>
    <span class="bolder">sit</span>
    <span>amet, consectetur adipiscing elit.</span>
</p>

我找不到通过中间bold标记截断文字并添加新标记的方法

3 个答案:

答案 0 :(得分:3)

以下转换应用于您提供的输入时,会生成您请求的结果。

<?xml version="1.0" encoding="UTF-8"?>
<xsl:transform version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="@*|node()">
        <xsl:copy><xsl:apply-templates select="@*|node()" /></xsl:copy>
    </xsl:template>

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

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

    <xsl:template match="par/text()">
        <span><xsl:copy-of select="." /></span>
    </xsl:template>

    <xsl:template match="bold">
        <span class="bolder"><xsl:value-of select="." /></span>
    </xsl:template>
</xsl:transform>

答案 1 :(得分:2)

以下XSLT样式表:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" indent="yes" omit-xml-declaration="yes" />
  <xsl:strip-space elements="*"/>

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

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

  <xsl:template match="text()">
    <span>
      <xsl:value-of select="normalize-space(.)"/>
    </span>
  </xsl:template>

  <xsl:template match="bold/text()">
    <span class="bolder">
      <xsl:value-of select="normalize-space(.)"/>
    </span>
  </xsl:template>

</xsl:stylesheet>

应用于此输入XML时:

<node>
  <par>
    Lorem ipsum dolor <bold>sit</bold> amet, consectetur adipiscing elit.
  </par>
</node>

产生以下输出:

<p>
  <span>Lorem ipsum dolor</span>
  <span class="bolder">sit</span>
  <span>amet, consectetur adipiscing elit.</span>
</p>

答案 2 :(得分:1)

您可以使用text()选择器并在内部元素的任一侧对其进行索引,从而实现您的目标。因此,当'Lorem ipsum dolor'的上下文为partext()[1]时,'amet, consectetur adipiscing elit.'的选择器将为text()[2]