2013-08-06 2 views
2

Я хочу, чтобы узнать, как искать слова в XML-файл и удалить всю строку с помощью XSLTкак искать текст в XML-файл и удалите эту строку с помощью XSLT

Пример: abc.xml

<server> 
    <mbean code="org.jboss.varia.property.SystemPropertiesService" 
    name="abc.props:type=Service,name=abcprop"> 
    <attribute name="Properties"> 
     abc.def.ghi=123 
     ghi.klm.nop=123 
     qrst.tuv.wxy=123 
     zab.cde.fgh=123 
     ijk.lmn.opq=remove 
     rst.uvw.xyz=123 
     abc.tuv.nop=123 
     ajc.dzf.goi=123 
    </attribute> 
</mbean> 
</server> 

Из приведенного выше примера я хочу найти слово «удалить» и удалить полную строку: ijk.lmn.opq=remove

Ожидаемый результат:

<server> 
     <mbean code="org.jboss.varia.property.SystemPropertiesService" 
     name="abc.props:type=Service,name=abcprop"> 
     <attribute name="Properties"> 
      abc.def.ghi=123 
      ghi.klm.nop=123 
      qrst.tuv.wxy=123 
      zab.cde.fgh=123 
      rst.uvw.xyz=123 
      abc.tuv.nop=123 
      ajc.dzf.goi=123 
     </attribute> 
    </mbean> 
    </server> 

Update:

Я попытался следующий код

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.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="*[(@* != 'DELETE')]"/> 
</xsl:stylesheet> 

Некоторые, как ее не работает, его удаление каждую вещь в файле XML и показывая пустой файл.

+0

В файле XML указаны строки, разделенные линией, или каждая строка в собственном элементе? –

+0

Я не уверен, что это строки, но каждая строка сама по себе, если я удалю строку, там не будет пустой строки. – phani

+0

Проблема, которая возникает у вас здесь, заключается в том, что ваш xml-файл на самом деле не является файлом xml.Вы уверены, что файл на самом деле так, как вы показали нам, или это текст, содержащийся внутри элемента, например ' ...'? –

ответ

2

С XSLT 2.0 вы можете использовать функцию replace на текстовых узлов вы хотите управлять:

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

    <xsl:output method="xml" indent="yes"/> 

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

    <xsl:template match="attribute[@name = 'Properties']/text()"> 
     <xsl:value-of select="replace(., '^.*remove.*$\n*', '', 'm')"/> 
    </xsl:template> 

</xsl:stylesheet> 
+0

Спасибо за решение, он сработал. – phani

0

XSLT 1.0 имеет только очень ограниченную функцию обработки строк, поэтому нет простого способа выполнить то, что вы просите с помощью чистого XSLT.

Лучше всего было бы использовать некоторые функции расширения, написанные на другом языке - большинство XSLT процессор может определять и называть такие расширения функции: Xalan-Java, Saxon, .NET

В качестве альтернативы рассмотреть не используя XSLT вообще - учитывая, что ваша проблема в основном связана с строкой, а не с XML: просто загрузите XML и обработайте строку, используя ваш любимый язык программирования.

+0

hmmm thats ограничение, так как я использую большинство своих других функций с помощью xslt, мне пришлось использовать некоторые bash или awk для обработки только для этой одной функции и ее проекта maven. – phani

+0

@phani: вы уверены, что это XSLT 1.0? Я наткнулся на примеры Maven XSLT, используя 2.0 – MiMo

+0

Я верю, что maven также поддерживает 1.0, вот что я делаю. – phani

3

Если ваш застряли с XSLT 1.0 вы можете использовать это:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

<!--String replace template--> 
<xsl:template name="removeline"> 
    <xsl:param name="string" /> 
    <xsl:choose> 
    <xsl:when test="contains($string,'remove')"> 
     <xsl:variable name="before"> 
     <xsl:value-of select="substring-before($string,'remove')"/> 
     </xsl:variable> 
     <xsl:variable name="after"> 
     <xsl:value-of select="substring-after($string,'remove')"/> 
     </xsl:variable> 
     <xsl:value-of select="substring($before,1, string-length($before) - 12)"/> 
     <xsl:call-template name="removeline"> 
      <xsl:with-param name="string" select="$after" /> 
     </xsl:call-template> 
    </xsl:when> 
    <xsl:otherwise> 
     <xsl:value-of select="$string" /> 
    </xsl:otherwise> 
    </xsl:choose> 
</xsl:template> 

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

    <!-- copy text nodes, and apply removeline template --> 
    <xsl:template match="text()" > 

    <!-- create empty string for match --> 
    <xsl:variable name="empty_string"/> 

    <xsl:if test="normalize-space(.) != $empty_string"> 
      <xsl:call-template name="removeline"> 
     <xsl:with-param name="string" select="normalize-space(.)"/> 
     </xsl:call-template> 
    </xsl:if> 
    </xsl:template> 

</xsl:stylesheet> 

Вы можете см. три шаблона здесь. Первая из них - это замена строковой функции для XSLT 1.0, у которой ее нет. Он основан на одном, найденном в нескольких местах сети. Вы можете найти более обобщенную реализацию в https://stackoverflow.com/a/7523245/2657945.

Второй и третий шаблоны выводят все узлы и атрибуты в документе по мере их получения, создавая специальный случай текстовых узлов, обрабатываемых первым шаблоном. Эта деталь основана на том, что находится в https://stackoverflow.com/a/427983/2657945.

Выход, как это (с помощью xsltproc, в Linux):

<server> 
    <mbean code="org.jboss.varia.property.SystemPropertiesService" name="abc.props:type=Service,name=abcprop"> 
    <attribute name="Properties">abc.def.ghi=123 ghi.klm.nop=123 qrst.tuv.wxy=123 zab.cde.fgh=123 rst.uvw.xyz=123 abc.tuv.nop=123 ajc.dzf.goi=123</attribute> 
    </mbean> 
</server> 

Это самый приблизительная результат я могу произвести с вами XML-образец, поэтому в зависимости от вашего файла и формат, который вы, возможно, нужно настроить его еще немного.

+0

спасибо за версию xslt 1.0, так как у меня нет каких-либо ограничений с использованием 2.0. Я лучше пойду с решением Мартина. – phani

+0

+1 за время и объяснение разделов решения. – phani