XSLT: Как «отфильтровать» узел xml со всеми его потомками по условию атрибута? - PullRequest
0 голосов
/ 24 сентября 2019

У меня есть XML-код с атрибутом слоя в некоторых узлах.Я хочу скопировать весь XML-контент, но без узлов (со всеми его потомками), у которых слой больше, чем параметр layer.

В приведенном ниже примере параметр layer получает значение 2, и я ожидаю, что все элементы, имеющиеАтрибут уровня 3 и его потомки не должны копироваться в новый XML.

XSLT:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" encoding="UTF-8" indent="yes"/>

    <xsl:param name="layer" select="2"/>

    <xsl:strip-space elements="*"/>

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

    <xsl:template match="@layer">
        <xsl:if test="current() &lt;=  $layer">
            <xsl:copy>
                <xsl:apply-templates/>
            </xsl:copy>
        </xsl:if>
    </xsl:template>
</xsl:stylesheet>

Входной XML:

<condition>
    <caseCond>Yes</caseCond>
    <inform layer="1">
        <para>layer 1 information</para>
    </inform>
    <procContent>
        <inform layer="2">
            <para>layer 2 information</para>
        </inform>
        <comment layer="2">
            <para>layer 2 information</para>
            <para layer="3">layer 3 information</para>
        </comment>
    </procContent>
    <endOfProc/>
</condition>

Ожидаемый результат:

<condition>
    <caseCond>Yes</caseCond>
    <inform layer="1">
        <para>layer 1 information</para>
    </inform>
    <procContent>
        <inform layer="2">
            <para>layer 2 information</para>
        </inform>
        <comment layer="2">
            <para>layer 2 information</para>

        </comment>
    </procContent>
    <endOfProc/>
</condition>

Текущий результат:

<?xml version="1.0" encoding="UTF-8"?>
<condition>
   <caseCond>Yes</caseCond>
   <inform layer="1">
      <para>layer 1 information</para>
   </inform>
   <procContent>
      <inform>
         <para>layer 2 information</para>
      </inform>
      <comment>
         <para>layer 2 information</para>
         <para>layer 3 information</para>
      </comment>
   </procContent>
   <endOfProc/>
</condition>

SO, только layer = "1" выражение существует в теге inform , но layer = "2" выражение удалено из всех содержащих тегов,

И самое важное, строка <para layer="3">layer 3 information</para> все еще существует.

, хотя я хочу, чтобы все теги с атрибутом layer = 3 и его потомки не отображались.

Ответы [ 2 ]

0 голосов
/ 24 сентября 2019

на основе вашего параметра @layerparm

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" encoding="UTF-8" indent="yes"/>

    <xsl:param name="layerparm" select="2"/>

    <xsl:strip-space elements="*"/>

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

    <xsl:template match="*[@layer > number($layerparm)]"/>
</xsl:stylesheet>
0 голосов
/ 24 сентября 2019

Попробуйте это:

<xsl:template match="para[@layer]"/>

полный код

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    exclude-result-prefixes="xs"
    version="2.0">
    <xsl:output  method="xml"/>
    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="para[@layer]"/>

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