XSLT: Удалить пустые узлы ~ И ~ Узлы с буквальным значением "Нуль" - PullRequest
0 голосов
/ 20 ноября 2018

Все,

Я использовал очень простую таблицу стилей в самом конце этого поста, чтобы удалить пустые узлы элементов из записей XML.XSLT выполняет свою работу адекватно, но записи XML фактически содержат буквальные «нулевые» значения в некоторых элементах, которые таблица стилей не удаляет.Пример:

<marc:datafield tag="400" ind1="1" ind2=" ">
   <marc:subfield code="a">null</marc:subfield>
   <marc:subfield code="q">null</marc:subfield>
   <marc:subfield code="d"></marc:subfield>
</marc:datafield>

Я удалил эти "пустые" вручную с помощью поиска и замены до запуска XSLT, процедуры, которая работает достаточно хорошо - но было бы более разумно иметь XSLTСам удалить эти значения, а также любые пустые узлы.Другими словами, я хотел бы выделить узлы, которые содержат «ноль»

<marc:subfield code="q">null</marc:subfield>

И такие узлы, как

<marc:subfield code="q"></marc:subfield>

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

Непосредственно ниже XSLT удаляет узлы с буквальным значением "null", но оставляет пустые узлы на месте.Мне нужно, чтобы XSLT делал обе вещи одновременно: удалял буквальные «нулевые» значения и содержащие их узлы, а также пустые узлы.Я пытался выполнить условие «выбери другое», но оно не работает.

<xsl:strip-space elements="*"/>
<xsl:template match="*[not(node())]"/>    
<xsl:template match="node()|@*">
    <xsl:if test="(. != '') and (. != 'null')">
    <xsl:copy>
        <xsl:apply-templates select="node()[normalize-space()]|@*"/>
    </xsl:copy>
    </xsl:if>    
</xsl:template>

Любая помощь, которую ты мог бы предложить, была бы чрезвычайно, очень признательна.

С уважением и большое спасибо -

Сед В.

ОРИГИНАЛ XSLT:

<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes" media-type="text/xml"/>
<xsl:strip-space elements="*"/>
<xsl:template match="*[not(node())]"/>    
<xsl:template match="node()|@*">
    <xsl:copy>
        <xsl:apply-templates select="node()[normalize-space()]|@*"/>
    </xsl:copy>
</xsl:template>

1 Ответ

0 голосов
/ 20 ноября 2018

Ты почти у цели.Ваш шаблон

<xsl:template match="*[not(node())]"/>

фильтрует пустые элементы - просто добавьте or text() = 'null' к предикату, чтобы отфильтровать элементы, которые переносят строки null.

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:strip-space elements="*"/>

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

    <!-- Filter empty elements or elements that contain the text 'null' -->
    <xsl:template match="*[not(node()) or text() = 'null']"/>
</xsl:stylesheet>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...