сортировка смежных сегментов с использованием элемента в сообщении xml с XSLT 1.0 - PullRequest
0 голосов
/ 06 июля 2018

Я новичок в XSLT. Мне нужна помощь в достижении следующих результатов. Я объясню свое требование на следующем примере:

Введите:

<library>
<Name>aaaaa</Name>
<Street>wwww</Street>
<Country>qqqq</Country>
<stock>
    <book>
        <Details>
            <Ranking>3</Ranking>
            <Title>abc3</Title>
            <Author>hhhhh3</Author>
        </Details>
    </book>
    <book>
        <Details>
            <Ranking>2</Ranking>
            <Title>abc2</Title>
            <Author>hhhhh2</Author>
        </Details>
    </book>
    <book>
        <Details>
            <Ranking>1</Ranking>
            <Title>abc1</Title>
            <Author>hhhhh1</Author>
        </Details>
    </book>
    <book>
        <Details>
            <Ranking>4</Ranking>
            <Title>abc4</Title>
            <Author>hhhhh4</Author>
        </Details>
    </book>
</stock>

Выход:

  <library>
    <Name>aaaaa</Name>
    <Street>wwww</Street>
    <Country>qqqq</Country>
<stock>
    <book>
        <Details>
            <Ranking>1</Ranking>
            <Title>abc1</Title>
            <Author>hhhhh1</Author>
        </Details>
    </book>
    <book>
        <Details>
            <Ranking>2</Ranking>
            <Title>abc2</Title>
            <Author>hhhhh2</Author>
        </Details>
    </book>
    <book>
        <Details>
            <Ranking>3</Ranking>
            <Title>abc3</Title>
            <Author>hhhhh3</Author>
        </Details>
    </book>
    <book>
        <Details>
            <Ranking>4</Ranking>
            <Title>abc4</Title>
            <Author>hhhhh4</Author>
        </Details>
    </book>
</stock>

Сегменты «книги» должны быть отсортированы в порядке возрастания на основе «Ранжирования» с использованием XSLT 1.0.

Я попробовал функцию сортировки, но работает, если все "Детали" находятся в одной "книге". Я перепробовал много других вещей, но безуспешно. Может кто-нибудь помочь мне?

Ответы [ 3 ]

0 голосов
/ 06 июля 2018
<xsl:output method="html" indent="yes"/>
    <xsl:strip-space elements="*"/>
    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>
    <xsl:template match="stock">
        <xsl:copy>

                <xsl:for-each select="book">

                    <xsl:sort order="ascending" select="Details/Ranking"/>
                    <xsl:copy-of select="."/>

                </xsl:for-each>

        </xsl:copy>
    </xsl:template>
Try it
0 голосов
/ 07 июля 2018

Мой друг помог мне в решении проблемы. Ниже код является ответом на мои вопросы. Спасибо Имрану и Аникет за ответы.

<?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" indent="yes"/>

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

    <!-- suppress all but the last node; see next template -->
    <xsl:template match="book[*]" /> 

    <!-- sort by package id -->
    <xsl:template match="book[last()]"> 
        <xsl:for-each select="../book">
            <xsl:sort order="ascending" select="Details/Ranking"/>
            <xsl:copy-of select="."/> 
        </xsl:for-each>
    </xsl:template> 
</xsl:stylesheet>
0 голосов
/ 06 июля 2018

Рекомендуется делиться XSLT, который пытался достичь желаемых результатов. Это помогает поставщикам решений просто решить возникшую проблему, а не начинать с нуля.

Следующий шаблон поможет вам в сортировке <book> на основе <Ranking>.

<xsl:template match="stock">
    <xsl:copy>
        <xsl:apply-templates select="book">
            <xsl:sort select="Details/Ranking" data-type="number" order="ascending" />
        </xsl:apply-templates>
    </xsl:copy>
</xsl:template>

В дополнение к вышеуказанному шаблону используйте шаблон identity transform для копирования входного XML как есть.

<xsl:template match="@* | node()">
    <xsl:copy>
        <xsl:apply-templates select="@* | node()" />
    </xsl:copy>
</xsl:template>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...