您可以使用XSL将行分隔列表转换为正确的xhtml列表吗?

时间:2012-04-07 11:47:57

标签: xml xslt plaintext

XSL旨在将XML转换为XML,但是您可以转换像

这样的文件
line1
line 2 -- foo
line 3

<ol>
<li>line1</li>
<li>line 2 -- foo</li>
<li>line 3</li>
</ol>

仅使用XSLT?

2 个答案:

答案 0 :(得分:3)

这在XSLT 2.0中很简单,在XSLT 1.0中也不难:

<强>予。 XSLT 1.0解决方案:

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

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

 <xsl:template match="text()" name="linesToLi">
  <xsl:param name="pText" select="."/>

  <xsl:if test="string-length($pText) > 0">
      <xsl:variable name="vthisLine" select=
      "substring-before(concat($pText, '&#xA;'), '&#xA;')"/>

      <li><xsl:value-of select="$vthisLine"/></li>

      <xsl:call-template name="linesToLi">
       <xsl:with-param name="pText" select="substring-after($pText, '&#xA;')"/>
      </xsl:call-template>
  </xsl:if>
 </xsl:template>
</xsl:stylesheet>

将此转换应用于以下XML文档(提供的文本,包含在单个顶部元素中,以构成格式良好的XML文档):

<t>line1
line 2 -- foo
line 3</t>

产生了想要的正确结果

<ol>
   <li>line1</li>
   <li>line 2 -- foo</li>
   <li>line 3</li>
</ol>

<强> II。 XSLT 2.0解决方案:

<xsl:stylesheet version="2.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="xs">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>

 <xsl:variable name="vText" as="xs:string">
 line1
 line 2 -- foo
 line 3
 </xsl:variable>

 <xsl:template match="/">
  <ol>
    <xsl:for-each select=
       "tokenize($vText, '\r?\n')[normalize-space()]">
      <li><xsl:sequence select="."/></li>
    </xsl:for-each>
  </ol>
 </xsl:template>
</xsl:stylesheet>

当对任何XML文档(未使用)应用此转换时,会生成所需的正确结果

<ol>
    <li> line1</li>
    <li> line 2 -- foo</li>
    <li> line 3</li>
</ol>

请注意

使用XSLT 2.0函数 unparsed-text() ,我们可以将任何文本文件作为字符串处理,并使用上面的代码将其拆分为行。

更确切地说,我们将使用这样的东西:

tokenize(unparsed-text($vSomeUrl), '\r?\n')[normalize-space()]

答案 1 :(得分:1)

不幸的是,XSLT 1没有高效的字符串处理和解析功能,因此它不适合这样的任务(即使它可能是

使用XSLT 2,这已经改变了。例如,请参阅this paper on XSLT 2 text parsing