XSL - хранить уникальные и отсортированные данные в переменной - PullRequest
0 голосов
/ 07 июня 2018

Используя XSLT 2.0 и Apache FOP, я хочу иметь возможность создавать новую переменную, иметь уникальные и отсортированные значения внутри нее по category, но сохранить узлы.Таким образом, новая переменная должна иметь следующие узлы:

<category>1. First Aid</category>
<category>2. Access control</category>
<category>3. Fire safety</category>
<category>4. Recognition</category>

Входной XML имеет следующий вид:

<equipment>
    <E0132>
        <category>1. First Aid</category>
        <description>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</description>
    </E0132>
    <E0133>
        <category>1. First Aid</category>
        <description>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</description>
    </E0133>
    <E4122>
        <category>3. Fire safety</category>
        <description>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</description>
    </E4122>
    <E4182>
        <category>3. Fire safety</category>
        <description>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</description>
    </E4182>
    <E4622>
        <category>2. Access control</category>
        <description>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</description>
    </E4622>
    <E5225>
        <category>4. Recognition</category>
        <description>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</description>
    </E5225>
</equipment>

Что касается XSL, то это то, что я до сих пор имел:

<xsl:variable name="equipment">
    <xsl:for-each-group select="//equipment/node()" group-by="category">
        <xsl:sort select="." order="ascending" />
        <xsl:value-of select="."/>              
    </xsl:for-each-group>        
</xsl:variable>

Но все работает не так, как ожидалось.Он не содержит узлов category, как мне хотелось бы, и я не знаю, как интегрировать здесь distinct-values() функцию XSL для достижения уникальности.

1 Ответ

0 голосов
/ 07 июня 2018

Вы можете использовать функцию current-grouping-key() для сохранения значений.Ниже обновленное объявление переменной.

<xsl:variable name="equipment">
    <xsl:for-each-group select="//equipment/*/category" group-by=".">
        <xsl:sort select="." order="ascending" />
        <category>
            <xsl:value-of select="current-grouping-key()"/>
        </category>              
    </xsl:for-each-group>   
</xsl:variable>

Для проверки содержимого переменной

<xsl:copy-of select="$equipment" />

дает вывод в виде

<category>1. First Aid</category>
<category>2. Access control</category>
<category>3. Fire safety</category>
<category>4. Recognition</category>

РЕДАКТИРОВАТЬ: Для печати значений переменных вцикл, попробуйте следующее

<!-- print variable values -->
<xsl:for-each select="$equipment/category" >
    <xsl:value-of select="." />
    <xsl:text>&#xA;</xsl:text>
</xsl:for-each>

Выход

1. First Aid
2. Access control
3. Fire safety
4. Recognition
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...