Nano Hash - криптовалюты, майнинг, программирование

XSLT 1.0: узлы сортировки меняют структуру

У меня есть следующая упрощенная структура XML:

<?xml version="1.0" encoding="UTF-8" ?>
<INVOIC02>
<IDOC BEGIN="1">
    <EDI_DC40 SEGMENT="1">
        <TABNAM>EDI_DC40</TABNAM>
    </EDI_DC40>
    <E1EDP01 SEGMENT="1">
        <MENGE>1.000</MENGE>
        <E1EDP19 SEGMENT="1">
            <QUALF>002</QUALF>
            <IDTNR>000000000000718221</IDTNR>
            <KTEXT>Orange</KTEXT>
        </E1EDP19>
        <E1EDP19 SEGMENT="1">
            <QUALF>Z03</QUALF>
            <IDTNR>7610400013079</IDTNR>
        </E1EDP19>
    </E1EDP01>
    <E1EDP01 SEGMENT="1">
        <MENGE>1.000</MENGE>
        <E1EDP19 SEGMENT="1">
            <QUALF>002</QUALF>
            <IDTNR>000000000000718160</IDTNR>
            <KTEXT>Pistache</KTEXT>
        </E1EDP19>     
        <E1EDP19 SEGMENT="1">
            <QUALF>003</QUALF>
            <IDTNR>7610400181600</IDTNR>
        </E1EDP19>
    </E1EDP01>
    <E1EDP01 SEGMENT="1">
        <MENGE>1.000</MENGE>
        <E1EDP19 SEGMENT="1">
            <QUALF>002</QUALF>
            <IDTNR>000000000000718228</IDTNR>
            <KTEXT>Strawberry</KTEXT>
        </E1EDP19>
        <E1EDP19 SEGMENT="1">
            <QUALF>003</QUALF>
            <IDTNR>7610400182287</IDTNR>
        </E1EDP19>
    </E1EDP01>
    <E1EDP01 SEGMENT="1">
        <MENGE>1.000</MENGE>
        <E1EDP19 SEGMENT="1">
            <QUALF>002</QUALF>
            <IDTNR>000000000000718221</IDTNR>
            <KTEXT>Orange</KTEXT>
        </E1EDP19>
        <E1EDP19 SEGMENT="1">
            <QUALF>003</QUALF>
            <IDTNR>7610400182218</IDTNR>
        </E1EDP19>
    </E1EDP01>
    <E1EDP01 SEGMENT="1">
        <MENGE>1.000</MENGE>
        <E1EDP19 SEGMENT="1">
            <QUALF>002</QUALF>
            <IDTNR>000000000000718160</IDTNR>
            <KTEXT>Pistache</KTEXT>
        </E1EDP19>
        <E1EDP19 SEGMENT="1">
            <QUALF>003</QUALF>
            <IDTNR>7610400181600</IDTNR>
        </E1EDP19>
    </E1EDP01>
    <E1EDP01 SEGMENT="1">
        <MENGE>1.000</MENGE>
        <E1EDP19 SEGMENT="1">
            <QUALF>002</QUALF>
            <IDTNR>000000000000718228</IDTNR>
            <KTEXT>Strawberry</KTEXT>
        </E1EDP19>
        <E1EDP19 SEGMENT="1">
            <QUALF>003</QUALF>
            <IDTNR>7610400182287</IDTNR>
        </E1EDP19>
    </E1EDP01>
    <E1EDS01 SEGMENT="1">
        <SUMID>001</SUMID>
        <SUMME>6</SUMME>
    </E1EDS01>
</IDOC>
</INVOIC02>

Мне нужно отсортировать <E1EDP01 SEGMENT="1"> сегментов по их <IDTNR> номеру с QUALF='002'

Итак, я придумал этот XSLT:

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

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

<xsl:template match="IDOC">
    <xsl:apply-templates>
        <xsl:sort select="E1EDP19[QUALF='002']/IDTNR"/>
    </xsl:apply-templates>     
</xsl:template>
</xsl:stylesheet>

Но в моем выводе сегменты <E1EDP01> отсортированы, но помещены в конец моей структуры:

<?xml version="1.0" encoding="UTF-8"?>
<INVOIC02>
<EDI_DC40 SEGMENT="1">
    <TABNAM>EDI_DC40</TABNAM>
</EDI_DC40>
<E1EDS01 SEGMENT="1">
    <SUMID>001</SUMID>
    <SUMME>6</SUMME>
</E1EDS01>
<E1EDP01 SEGMENT="1">
    <MENGE>1.000</MENGE>
    <E1EDP19 SEGMENT="1">
        <QUALF>002</QUALF>
        <IDTNR>000000000000718160</IDTNR>
        <KTEXT>Pistache</KTEXT>
    </E1EDP19>
    <E1EDP19 SEGMENT="1">
        <QUALF>003</QUALF>
        <IDTNR>7610400181600</IDTNR>
    </E1EDP19>
</E1EDP01>
<E1EDP01 SEGMENT="1">
    <MENGE>1.000</MENGE>
    <E1EDP19 SEGMENT="1">
        <QUALF>002</QUALF>
        <IDTNR>000000000000718160</IDTNR>
        <KTEXT>Pistache</KTEXT>
    </E1EDP19>
    <E1EDP19 SEGMENT="1">
        <QUALF>003</QUALF>
        <IDTNR>7610400181600</IDTNR>
    </E1EDP19>
</E1EDP01>
<E1EDP01 SEGMENT="1">
    <MENGE>1.000</MENGE>
    <E1EDP19 SEGMENT="1">
        <QUALF>002</QUALF>
        <IDTNR>000000000000718221</IDTNR>
        <KTEXT>Orange</KTEXT>
    </E1EDP19>
    <E1EDP19 SEGMENT="1">
        <QUALF>Z03</QUALF>
        <IDTNR>7610400013079</IDTNR>
    </E1EDP19>
</E1EDP01>
<E1EDP01 SEGMENT="1">
    <MENGE>1.000</MENGE>
    <E1EDP19 SEGMENT="1">
        <QUALF>002</QUALF>
        <IDTNR>000000000000718221</IDTNR>
        <KTEXT>Orange</KTEXT>
    </E1EDP19>
    <E1EDP19 SEGMENT="1">
        <QUALF>003</QUALF>
        <IDTNR>7610400182218</IDTNR>
    </E1EDP19>
</E1EDP01>
<E1EDP01 SEGMENT="1">
    <MENGE>1.000</MENGE>
    <E1EDP19 SEGMENT="1">
        <QUALF>002</QUALF>
        <IDTNR>000000000000718228</IDTNR>
        <KTEXT>Strawberry</KTEXT>
    </E1EDP19>
    <E1EDP19 SEGMENT="1">
        <QUALF>003</QUALF>
        <IDTNR>7610400182287</IDTNR>
    </E1EDP19>
</E1EDP01>
<E1EDP01 SEGMENT="1">
    <MENGE>1.000</MENGE>
    <E1EDP19 SEGMENT="1">
        <QUALF>002</QUALF>
        <IDTNR>000000000000718228</IDTNR>
        <KTEXT>Strawberry</KTEXT>
    </E1EDP19>
    <E1EDP19 SEGMENT="1">
        <QUALF>003</QUALF>
        <IDTNR>7610400182287</IDTNR>
    </E1EDP19>
</E1EDP01>
</INVOIC02>

Сегмент <E1EDS01> идет перед отсортированными сегментами, но должен быть в конце. Почему это? Может ли кто-нибудь дать мне объяснение? Спасибо за помощь и с наилучшими пожеланиями, Петр.

30.03.2012

Ответы:


1

это происходит потому, что вы сортируете все, а элементы, отличные от E1EDP01, будут иметь пустые ключи сортировки. вместо этого вы можете форсировать их позицию, например:

<xsl:template match="IDOC">
    <xsl:apply-templates select="EDI_DC40"/>
    <xsl:apply-templates select="E1EDP01">
        <xsl:sort select="E1EDP19[QUALF='002']/IDTNR"/>
    </xsl:apply-templates>     
    <xsl:apply-templates select="E1EDS01"/>
</xsl:template>
30.03.2012
  • Спасибо panda-34, это интересный подход, я никогда не использовал его раньше. Спасибо, я воспользуюсь вашим решением. С уважением, Питер +1 02.04.2012
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..