Удаление всех элементов, кроме одного, в XML с использованием XSLT - PullRequest
2 голосов
/ 23 сентября 2010

Я хотел бы удалить все элементы из XML, кроме содержимого элемента с именем

.Например:
<root>
 <a>This will be stripped off</a>
 <source>But this not</source>
</root>

После XSLT:

But this not

Я пробовал это, но безуспешно (без вывода):

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

 <xsl:output omit-xml-declaration="yes"/>

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

    <xsl:template match="@*|node()">

</xsl:stylesheet>

Из комментариев:

В моем реальном XML-файле элемент источника находится в другом пространстве имен.Мне нужно Google, как создать шаблон соответствия для элемента в другом пространстве имен.Я хотел бы поместить каждую извлеченную строку также в новую строку; -)

Ответы [ 2 ]

4 голосов
/ 23 сентября 2010

Ты не далеко. Причина, по которой вы не получаете никаких выходных данных, заключается в том, что ваш корневой шаблон соответствия не рекурсивен, а просто завершается, поэтому вам нужно поместить в него вызов apply-templates. Следующая таблица стилей дает ожидаемый результат.

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

    <xsl:output method="text"/>

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

    <xsl:template match="source">
        <xsl:value-of select="text()"/>
    </xsl:template>

</xsl:stylesheet>

Обратите внимание, что я изменил режим вывода на text и шаблон source, чтобы просто выводить текстовое значение узла, потому что похоже, что вы хотите текст, а не вывод XML.

0 голосов
/ 23 сентября 2010

Самое интересное, самое скорое решение:

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:ex="http://example.org">
    <xsl:output method="text"/>
    <xsl:template match="text()"/>
    <xsl:template match="ex:source">
        <xsl:value-of select="concat(.,'&#xA;')"/>
    </xsl:template>
</xsl:stylesheet>

С этим входом:

<root xmlns="http://example.org">
    <a>This will be stripped off</a>
    <source>But this not</source>
</root>

Выход:

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