Выводить только дубликаты в окончательном текстовом выводе - PullRequest
0 голосов
/ 23 января 2019

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

Вот мой XML:

<Library>
    <Book>
        <Code>1</Code>
        <Title>MANAGEMENT</Title>
    </Book>
    <Book>
        <Code>1</Code>
        <Title>MANAGEMENT</Title>
    </Book>
    <Book>
        <Code>1</Code>
        <Title>MANAGEMENT</Title>
    </Book>
    <Book>
        <Code>1</Code>
        <Title>MANAGEMENT</Title>
    </Book>
    <Book>
        <Code>1</Code>
        <Title>MANAGEMENT</Title>
    </Book>
    <Book>
        <Code>10</Code>
        <Title>MECHANICAL</Title>
    </Book>
    <Book>
        <Code>106</Code>
        <Title>TRANSPORTATION</Title>
    </Book>
</Library>

А вот мой текущий XSL (неверный):

<xsl:template match="Book">

    <xsl:value-of select="this:fixedOutput(Code)" />

    <xsl:value-of select="this:fixedOutput(Title)" />

    <xsl:value-of select="$linefeed" />

</xsl:template>

Мой вывод сейчас:

1 | УПРАВЛЕНИЕ |1 | УПРАВЛЕНИЕ |1 | УПРАВЛЕНИЕ |1 | УПРАВЛЕНИЕ |1 | УПРАВЛЕНИЕ |10 | МЕХАНИЧЕСКИЕ |106 | ТРАНСПОРТИРОВКА |

Но я хочу, чтобы это было так:

1 | УПРАВЛЕНИЕ |10 | МЕХАНИЧЕСКИЕ |106 | ТРАНСПОРТИРОВКА |

Я не уверен, как использовать синтаксис различных значений, чтобы добраться туда, куда мне нужно.

1 Ответ

0 голосов
/ 23 января 2019

Решение XSLT 1.0 , использующее key и функцию generate-id() ( мюнхенская группировка ) для получения различных значений:

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

<xsl:key name="bookCode" match="/Library/Book/Code" use="." />

<xsl:template match="/">
    <xsl:for-each select="/Library/Book/Code[generate-id()
                                   = generate-id(key('bookCode',.)[1])]">

        <xsl:value-of select="this:fixedOutput(.)" />
        <xsl:value-of select="this:fixedOutput(../Title)" />
        <xsl:value-of select="$linefeed" />
    </xsl:for-each>
</xsl:template>

Решение XSLT 2.0 , которое использует xsl:for-each-group, как @ michael.hor257k сказал:

<?xml version="1.0" encoding="UTF-8" ?>
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="2.0" xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="xs">

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

<xsl:template match="Library">
    <xsl:for-each-group select="Book" group-by="concat(Code,Title)">
        <xsl:apply-templates select="." />
    </xsl:for-each-group>
</xsl:template>

<xsl:template match="Book">
    <xsl:value-of select="this:fixedOutput(Code)" />
    <xsl:value-of select="this:fixedOutput(Title)" />
    <xsl:value-of select="$linefeed" />
</xsl:template>

Примечание : поскольку this:fixedOutput в вашем коде не относится ни к какому пространству имен, оно использовалось как есть.

См. Это: http://xsltransform.net/3MP2uBE

...