2012-07-01 3 views
3

Я боролся с тем, что было бы лучшим решением, чтобы избавиться от некоторых конкретных тегов. В настоящее время я использую некоторую повторяющуюся находку/замену с некоторым регулярным выражением, но обязательно должен быть лучший способ. Просто не понятно, как это сделать в xslt напрямую.RegEx для удаления шаблона при запуске узла

Примите следующий пример:

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

У меня есть довольно некоторые из них, и все ту же структуру, где [Некоторые Indicator] является своего рода идентификатором списка и может быть любым из следующих :

  • один или более цифр, иногда сопровождаемые точкой
  • один символ, иногда с последующим дефисом и другой персонаж
  • один CHARACT эр в заданном диапазоне элемент кода (в данном случае 57600 до 58607)
  • и некоторые другие, которые являются вариациями на выше

Я хочу, чтобы избавиться от всех этих без необходимости вручную найти/заменить несколько сотен раз. Я пытаюсь xsl: проанализировать строку, но затем она заменяет все, не беспокоя положение.

Некоторые примеры:

<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> 

должны стать:

<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> 

Так что я ищу в XSLT (2) сценария, который говорит что-то вроде: «Всякий раз, когда вы видите локальный узел заканчивающуюся на данный индикатор и вкладку div, разделите индикатор и вкладку div '. Не ища полного решения для примера, просто что-то, чтобы поставить меня в правильном направлении. Если я знаю, как это будет работать для одного шаблона, я, вероятно, смогу выяснить остальную часть себя

Заранее благодарим.

ответ

2

Это преобразование:

<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> 

при нанесении на поставленном XML документа:

<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> 

производит разыскиваемого, правильный результат:

<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> 
2

заменить (?<=<local xml:lang="\w+">).+<div class="tab"/> с пустой строкой включают регулярное выражение опции multylines

+0

Благодаря уже, но этот код немного слишком широко, как это было бы также заменить вкладку дивы, которые не в начале узла, а где-то в другом месте. Возьмите что-то вроде [locale lang = en] некоторой строки и [div = tab] и еще немного контента [/ locale]. В этом случае вкладка должна оставаться, ее нужно удалить только тогда, когда она является первым элементом после индикатора в элементе локали. Извините за сложность :-) – Wokoman

+0

только что измененное регулярное выражение –

Смежные вопросы