RegEx para eliminar el patrón al inicio del nodo

He estado luchando con cuál sería la mejor solución para deshacerme de algunas etiquetas específicas. Actualmente uso algunas búsquedas/reemplazos repetitivas con algunas expresiones regulares, pero seguro que debe haber una mejor manera. Simplemente no tengo claro cómo hacerlo en xslt directamente.

Tome el siguiente ejemplo:

<local xml:lang="en">[Some Indicator]<div class="tab"/>some more content here</local>

Tengo bastantes de estos, y todos siguen la misma estructura, donde [Algún indicador] es una especie de identificador de lista y puede ser cualquiera de los siguientes:

  • uno o más dígitos, a veces seguidos de un punto
  • un carácter, a veces seguido de un guión y otro carácter
  • un carácter en un rango de punto de código determinado (en este caso, 57600 a 58607)
  • y algunos otros que son variaciones de lo anterior

Quiero deshacerme de todos estos sin tener que buscar/reemplazar manualmente unos cientos de veces. He estado probando xsl:analyze-string pero luego reemplaza todo sin molestar la posición.

Algunos ejemplos :

<some_nodes_above>
<local xml:lang="en">1<div class="tab"/>some more content here</local>
<local xml:lang="en">2.<div class="tab"/>some more content here</local>
<local xml:lang="fr">2-A<div class="tab"/>some more content here</local>
<local xml:lang="de">&#57600;<div class="tab"/>some more content here</local>
</some_nodes_above>

debe convertirse :

<some_nodes_above>
<local xml:lang="en">some more content here</local>
<local xml:lang="en">some more content here</local>
<local xml:lang="fr">some more content here</local>
<local xml:lang="de">some more content here</local>
</some_nodes_above>

Así que estoy buscando un script xslt (2) que diga algo como 'Siempre que vea un nodo local seguido de un indicador dado y una pestaña div, elimine el indicador y la pestaña div'. No busco una solución completa para el ejemplo, solo algo que me guíe en la dirección correcta. Si sé cómo funcionaría para un patrón, probablemente pueda averiguar el resto por mí mismo.

Gracias de antemano.

preguntado el 01 de julio de 12 a las 20:07

2 Respuestas

Esta transformación:

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

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

 <xsl:template match=
  "local/node()[1]
               [self::text()
          and
            following-sibling::node()[1]
               [self::div and @class eq 'tab']
              and
               (
                matches(., '^(\d\.?)|(.\-.)$')
               or
                 string-length(.) eq 1
                and
                 string-to-codepoints(.) ge 57600
                and
                 string-to-codepoints(.) le 58607
                )
               ]"/>

 <xsl:template match=
  "div[@class eq 'tab'
     and
       preceding-sibling::node()[1]
               [self::text()
              and
               (
                matches(., '^(\d\.?)|(.\-.)$')
               or
                 string-length(.) eq 1
                and
                 string-to-codepoints(.) ge 57600
                and
                 string-to-codepoints(.) le 58607
                )
               ]
      ]"/>
</xsl:stylesheet>

cuando se aplica en el documento XML proporcionado:

<some_nodes_above>
    <local xml:lang="en"
     >1<div class="tab"/>some more content here</local>
    <local xml:lang="en"
     >2.<div class="tab"/>some more content here</local>
    <local xml:lang="fr"
     >2-A<div class="tab"/>some more content here</local>
    <local xml:lang="de"
     >&#57600;<div class="tab"/>some more content here</local>
</some_nodes_above>

produce el resultado correcto deseado:

<some_nodes_above>
   <local xml:lang="en">some more content here</local>
   <local xml:lang="en">some more content here</local>
   <local xml:lang="fr">some more content here</local>
   <local xml:lang="de">some more content here</local>
</some_nodes_above>

Respondido 01 Jul 12, 22:07

reemplazar (?<=<local xml:lang="\w+">).+<div class="tab"/> con una cadena vacía incluye la opción de expresión regular multilíneas

Respondido 01 Jul 12, 21:07

Ya gracias, pero este código es un poco demasiado amplio, ya que también reemplazaría tabulaciones que no están al comienzo del nodo, sino en otro lugar. Tome algo como [locale lang=en]una cadena y un [div=tab] y algo más de contenido[/locale]. En este caso, la pestaña debe permanecer, solo debe eliminarse cuando es el primer elemento después de un indicador en un elemento local. Perdón por la complejidad :-) - Wokoman

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.