XSLT 1.0: копировать все, кроме определенных узлов в соответствии со значением и переменной - PullRequest
2 голосов
/ 16 августа 2011

У меня есть следующий (упрощенный) XML, который я получаю в системной среде:

<?xml version="1.0" encoding="UTF-8"?>
<root>
<IS_LOG>
    <USER>19291</USER>
    <DATE>2011-08-15</DATE>
    <TIME>15:36:36</TIME>
    <SYST>sy1</SYST>
    <MATERIALS>
        <item>
            <sy>100</sy>
            <mat>000000000000310000</mat>
        </item>
        <item>
            <sy>100</sy>
            <mat>000000000000491078</mat>
        </item>
    </MATERIALS>
</IS_LOG>
</root>

Система, с которой я работаю, передает мне переменную во время выполнения, которая не включена в структуру XML выше.

У меня есть следующий XSLT:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xd="http://www.oxygenxml.com/ns/doc/xsl" version="1.0">

<!-- System variable whose value I normally only get only at runtime;
for test purposes set locally -->
<xsl:variable name="SenderService" select="'AT'"/>

<xsl:template match="@*|node()">
    <xsl:choose>
        <xsl:when test="$SenderService='AT'">
            <xsl:copy>
                <xsl:apply-templates mode="AT" select="@*|node()"/>
            </xsl:copy>
        </xsl:when>
        <xsl:otherwise>
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
        </xsl:otherwise>
   </xsl:choose> 
</xsl:template>


<xsl:template mode="AT" match="item[mat &gt; 000000000000299999 and mat &lt; 000000000000399999]"/>

</xsl:stylesheet>

Теперь мне нужно скопировать все элементы item, за исключением тех, где mat находится в диапазоне номеров от 300000 до 399999 и SenderService я сидела'.Если проверить его локально, я изменяю SenderService в моем XSLT, например, на 'Z', вывод выглядит нормально, все items копируются:

<?xml version="1.0" encoding="UTF-8"?>
<root>
<IS_LOG>
    <USER>19291</USER>
    <DATE>2011-08-15</DATE>
    <TIME>15:36:36</TIME>
    <SYST>sy1</SYST>
    <MATERIALS>
        <item>
            <sy>100</sy>
            <mat>000000000000310000</mat>
        </item>
        <item>
            <sy>100</sy>
            <mat>000000000000491078</mat>
        </item>
    </MATERIALS>
</IS_LOG>
</root>

Но если я установлю SenderService в 'В этом случае результат выглядит следующим образом:

    <?xml version="1.0" encoding="UTF-8"?><root>

    19291
    2011-08-15
    15:36:36
    sy1



            100
            000000000000491078



</root>

Копируется правильный элемент, но без тегов.Кто-нибудь знает, как изменить XSLT?

Спасибо за помощь, Питер

1 Ответ

3 голосов
/ 16 августа 2011
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" indent="yes"/>

    <xsl:variable name="SenderService" select="'AT'"/>

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


    <xsl:template match="item[mat &gt; 000000000000299999 and mat &lt; 000000000000399999]">
        <xsl:if test="$SenderService != 'AT'">
            <xsl:copy-of select="."/>
        </xsl:if>
    </xsl:template>

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