estoy transformación XSLT mis-hojas de estilo en la documentación, y quiero una experiencia rica dentro de los nodos de comentario para cada código-trozo, por lo tanto, quiero convertir el siguiente comentario y la salida como XHTML:la conversión de rebajas sencilla (cadena) a HTML con XSLT
cadena:
# This is a title with __bold__ text and *italic* # This is just a normal line - list point with some __bold__ - list point with a "link"[http://www.stackoverflow.com]
salida deseada:
<h1> This is a title with <strong>bold</strong> and <span>italic</span> </h1>
<p>This is a normal line</p>
<ul>
<li>list point with some <strong>bold</strong></li>
<li>list point with a <a href="http://www.stackoverflow.com">link</a></li>
</ul>
me trataron con una función recursiva que utiliza XSL: analizar cuerdas de forma recursiva a partir de una regla establecer, pero no puede encontrar una solución que funciona realmente bien.
Cualquiera haber hecho esto últimamente, o hay algunos marcos por ahí que tiene funciones para hacer esto?
Gracias de antemano! :)
Editar: Añadido un ejemplo sucia:
<!-- Output comments -->
<xsl:template match="comment()" mode="COMMENT">
<xsl:copy-of select="ips:groupReplace(normalize-space(.),
'
(.*)(\n|\r)(.*),
(.*)\*(.*)\*(.*),
(.*)\*\*(.*)\*\*(.*),
(.*)__(.*)__(.*),
(.*)#(.*)#(.*),
(.*)-(.*)
',
'
br,
span.italic,
span.bold,
strong,
h1,
li
')" />
</xsl:template>
<!-- Initializing the iterateRegex function -->
<xsl:function name="ips:groupReplace">
<xsl:param name="string" as="xs:string" />
<xsl:param name="search" />
<xsl:param name="replace" />
<xsl:variable name="regex" select="tokenize($search, ',')" />
<xsl:variable name="replacements" select="tokenize($replace, ',')" />
<xsl:copy-of select="ips:iterateRegex(count($replacements), $string, $regex, $replacements)" />
</xsl:function>
<!-- Iterate each regex -->
<xsl:function name="ips:iterateRegex">
<xsl:param name="counter" />
<xsl:param name="string" />
<xsl:param name="list_regex" />
<xsl:param name="list_replace" />
<xsl:variable name="newStr">
<xsl:analyze-string select="$string" regex="{normalize-space($list_regex[$counter])}" flags="xm">
<xsl:matching-substring>
<xsl:variable name="cc" select="contains($list_replace[$counter], '.')" />
<xsl:variable name="tag" select="normalize-space(if ($cc) then (substring-before($list_replace[$counter], '.')) else ($list_replace[$counter]))" />
<xsl:copy-of select="regex-group(1)" />
<xsl:choose>
<xsl:when test="normalize-space(regex-group(2)) = ''">
<xsl:element name="{$tag}" />
</xsl:when>
<xsl:otherwise>
<xsl:element name="{$tag}" >
<xsl:if test="$cc">
<xsl:attribute name="class" select="substring-after($list_replace[$counter],'.')" />
</xsl:if>
<xsl:copy-of select="regex-group(2)" />
</xsl:element>
</xsl:otherwise>
</xsl:choose>
<xsl:copy-of select="regex-group(3)" />
</xsl:matching-substring>
<xsl:non-matching-substring>
<xsl:copy-of select="." />
</xsl:non-matching-substring>
</xsl:analyze-string>
</xsl:variable>
<xsl:variable name="count" select="number($counter) - 1" />
<xsl:choose>
<xsl:when test="$count > 0">
<xsl:copy-of select="ips:iterateRegex($count, $newStr, $list_regex, $list_replace)" />
</xsl:when>
<xsl:otherwise>
<xsl:copy-of select="$newStr" />
</xsl:otherwise>
</xsl:choose>
</xsl:function>
¿Por qué tratarías de transformar contenido no XML usando XSLT? Es una herramienta completamente incorrecta para el trabajo. –
@Greg: ese tipo de depende de la versión de XSLT que puede usar. Con XSLT 1.0, de hecho, muy difícil. Pero con XSLT 2.0 y su extenso regex y otro soporte de procesamiento de cadenas, y funciones arbitrarias de carga de documentos de texto, se vuelve casi trivial. – Abel
@Sveisvei: ¿qué versión o procesador de XSLT usas? ¿Puedes usar métodos o funciones de extensión y, de ser así, en qué idioma? – Abel