2012-01-19 4 views
1

У меня есть большой XML-файл, который настроил мое приложение. Для каждой конфигурации есть много комментариев. Я хочу использовать xsl для удаления некоторого комментария в соответствии с узлом.xsl для удаления комментариев от определенных узлов

<!-- if you need to use storage --> 
<Storage> 
    <!-- Oracle configuration 
    <StorageDb database="OracleService"></StorageDb> 
    --> 
    <!-- SqlServer configuration 
    <StorageDb database="SqlService"></StorageDb> 
    --> 
</Storage> 

Когда я запускаю мой XSL я хочу, чтобы удалить только комментарии от конфигурации Oracle, так что мой результат будет:

<!-- if you need to use storage --> 
<Storage> 
    <StorageDb database="OracleService"></StorageDb> 

    <!-- SqlServer configuration 
    <StorageDb database="SqlService"></StorageDb> 
    --> 
</Storage> 

Любая идея, как я бы это сделать?

+2

ли вы имеете в виду 'раскомментировать' некоторые узлы? Другими словами: извлечь узлы из комментариев. – DRCB

+0

Да, вы правы –

+1

Почему вы хотите использовать XSL для этого? Если есть способ добиться такого преобразования - это будет более или менее уродливое взломать XSL. Я бы предложил простой поиск и замену для решения этой проблемы. – DRCB

ответ

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

<xsl:template match="comment()"> 
    <xsl:value-of disable-output-escaping="yes" select="substring-after(.,'Oracle configuration')"/> 
</xsl:template> 
+0

Неплохой ответ, но помните, что d-o-e будет работать только в ограниченных обстоятельствах (например, когда XSLT-процессор контролирует сериализацию) и вообще не требуется выполнять его. – LarsH

2

Если я правильно понял, то, что вы просите, не удаляет узлы комментариев, а анализирует их и преобразует их в элементы. Вы можете сделать это с помощью возможностей XSLT 2.0 и regex, но я не думаю, что это хорошая идея (не очень надежная).

XSLT может помочь вам в любом случае, но сначала вам нужно создать скрипку для конфигурационного файла. Давайте представим, что-то вроде этого:

<?xml version="1.0" encoding="UTF-8"?> 
<configuration> 
    ... 
    <Storage/> 
    ... 
</configuration> 

Ваш XSLT может выглядеть так:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
    <xsl:param name="service" select="'OracleService'"/> 
    <xsl:template match="@*|node()"> 
     <xsl:copy> 
      <xsl:apply-templates select="@*|node()"/> 
     </xsl:copy> 
    </xsl:template> 
    <xsl:template match="Storage"> 
     <xsl:copy> 
      <xsl:copy-of select="@*"/> 
      <StorageDb database="{$service}"/> 
     </xsl:copy> 
    </xsl:template> 
</xsl:stylesheet> 

поведение по умолчанию выбирает значение OracleService для параметра service. Это поведение можно переопределить, передав для этого параметра другое значение XSLT.

По умолчанию результат:

<?xml version="1.0" encoding="utf-8"?> 
<configuration> 
    ... 
    <Storage><StorageDb database="OracleService"/></Storage> 
    ... 
</configuration> 
+0

У меня есть узел уже в XML-файле, но прокомментирован. Мне нужно раскомментировать этот узел. извините, это понятно? –

+0

Да, я понял, что у вас есть комментарии в XML, я просто хотел указать, что более надежной альтернативой комментарию analysys может быть XSLT-файл с входными параметрами для создания вашего файла конфигурации. –

+0

«не удалять узлы комментариев, а анализировать их и преобразовывать в узлы XML». Я думаю, вы имеете в виду «преобразовать их в элементы»? Они уже являются узлами XML. – LarsH

1

Если вы можете использовать Saxon в качестве процессора XSLT, то надежный способ сделать это (я имею в виду, метод, который не опирается на disable-output-escaping) было бы использовать saxon:parse() по содержанию каждого узла комментариев после удаления ненужного текста. Результат saxon:parse() - это узел XML, который можно выводить в результирующий документ обычным способом.

т.д .:

<xsl:template match="comment()"> 
    <xsl:copy-of select="saxon:parse(substring-after(., 'configuration'))"/> 
</xsl:template> 

Более подробное обсуждение см XSLT parse text node as XML?

+1

Мое понимание заключается в том, что xith 'saxon: parse()' function, вы должны предоставить строку, представляющую действительный XML-документ (см. Http: //www.saxonica.ком/документация/расширение/функция/parse.xml). Итак, чтобы использовать эту функцию на узлах комментариев, сначала нужно выполнить действие над текстовым значением ('substring',' replace' ...). –

+0

@VincentBiragnet: Вы совершенно правы ... Я предположил, что без проверки, что 'parse()' может анализировать фрагмент документа. Я отредактирую свой ответ соответственно. – LarsH

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