XSLT для удаления тегов из файла XML - PullRequest
2 голосов
/ 06 сентября 2011

У меня есть этот XML-файл:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<results>
  <output>
    <status>OK</status>
    <usage>Please use it</usage>
    <url/>
    <language>english</language>
    <category>science_technology</category>
    <score>0.838661</score>
  </output>
</results>

Я хочу удалить теги <output> </output> из этого XML.

ВЫХОД ОЖИДАЕТСЯ

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
 <results>
 <status>OK</status>
    <usage>Please use it</usage>
    <url/>
    <language>english</language>
    <category>science_technology</category>
    <score>0.838661</score>

</results>

Как можноЯ делаю это?

Ответы [ 2 ]

4 голосов
/ 06 сентября 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="output"><xsl:apply-templates/></xsl:template>
</xsl:stylesheet>

, когда это преобразование применяется к предоставленному документу XML :

<results>
  <output>
    <status>OK</status>
    <usage>Please use it</usage>
    <url/>
    <language>english</language>
    <category>science_technology</category>
    <score>0.838661</score>
  </output>
</results>

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

<results>
   <status>OK</status>
   <usage>Please use it</usage>
   <url/>
   <language>english</language>
   <category>science_technology</category>
   <score>0.838661</score>
</results>

Пояснение :

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

  2. Существует один шаблон, переопределяющий правило идентификации .Он соответствует любому элементу output и предотвращает его копирование в вывод, но продолжает обработку любого из его дочерних элементов.

Помните : переопределение идентификатораПравило - это самый фундаментальный и самый мощный шаблон проектирования XSLT.

2 голосов
/ 06 сентября 2011

Наименьшее возможное:

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

    <xsl:template match="results">
     <xsl:copy>
       <xsl:copy-of select="output/*"/>
     </xsl:copy>
    </xsl:template>

</xsl:stylesheet>

или используя правило идентификации:

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

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

    <xsl:template match="results">
        <xsl:copy>
            <xsl:apply-templates select="output/*"/>
        </xsl:copy>
    </xsl:template>

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