парсинг XML для пропуска тегов - PullRequest
1 голос
/ 10 февраля 2011

У меня есть следующая таблица стилей, чтобы пропустить теги XYZ_1, XYZ_2.

  • Как мне заставить его работать на XYZ _ *
  • Кроме того, в выводе пропущенные теги содержат пустые строки, как их подавить.

Заранее спасибо.

<?xml version="1.0" ?>

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

<xsl:output method="html" indent="no" encoding="utf-8" omit-xml-declaration="yes" />

<xsl:template match="*">
        <xsl:copy>
                <xsl:copy-of select="@*" />
                <xsl:apply-templates />
        </xsl:copy>
</xsl:template>

<xsl:template match="XYZ_1" />
<xsl:template match="XYZ_2" />

</xsl:stylesheet>

Вот пример XML

<?xml version="1.0" encoding="UTF-8"?>
<tags>
    <tag>
        <tag1>TagName1</tag1>
        <XYZ_1>
            <name>1.pdf</name>
        </XYZ_1>
        <XYZ_2>
            <c_name>chart1.gif</c_name>
        </XYZ_2>
    </tag>
</tags>

на выходе получается

<?xml version="1.0" encoding="UTF-8"?>
<tags>
    <tag>
        <tag1>TagName1</tag1>





    </tag>
</tags>

Ответы [ 2 ]

3 голосов
/ 10 февраля 2011

Используйте

<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="*[starts-with(name(), 'XYZ_')]"/>
</xsl:stylesheet>

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

<?xml version="1.0" encoding="UTF-8"?>
<tags>
    <tag>
        <tag1>TagName1</tag1>
        <XYZ_1>
            <name>1.pdf</name>
        </XYZ_1>
        <XYZ_2>
            <c_name>chart1.gif</c_name>
        </XYZ_2>
    </tag>
</tags>

желаемый, правильный результат получается :

<tags>
   <tag>
      <tag1>TagName1</tag1>
   </tag>
</tags>

Объяснение

  1. Правило идентификации (если не переопределено) копирует каждый узел как есть

  2. Единственный переопределяющий шаблон - это соответствующие элементы, у которых name() starts-with() "XYZ _" и этот шаблон имеет пустое тело - это эффективно удаляет любой соответствующий элемент из выходных данных.

  3. Директива <xsl:strip-space elements="*"/> дает указание процессору XSLT анализировать документ XML, игнорируя любой текстовый узел, содержащий только пробелы, в документе. Таким образом, при преобразовании не виден ни один пробельный узел, следовательно, такие узлы не копируются в выходные данные. Это устраняет нежелательные пробелы, о которых сообщается как вторая проблема.

2 голосов
/ 10 февраля 2011

Я полагаю, что вы использовали бы начальную строку следующим образом:

<xsl:template match="*[starts-with(name(), 'XYZ_')]">

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

Не уверен изпредоставленная информация о второй части вашего вопроса.Не могли бы вы опубликовать образец анализируемого файла?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...