xslt для каждой группы вопрос - PullRequest
1 голос
/ 04 июля 2010

Мне нужно xml для группировки по категориям, которые я пытаюсь использовать

<xsl:for-each-group  select="ItemList/Item"  group-by="CategoryID">

Как я могу получить CategoryName, CategoryID или любую информацию, относящуюся к Category во время преобразования?

ОригиналXML

<ItemList>
<Item>
    <CategoryID>1</CategoryID>
    <CategoryName>Book</CategoryName>
    <ItemName>ASP.NET</ItemName>
    <ItemDetails>ASP.NET12345</ItemDetails>
</Item>
<Item>
    <CategoryID>1</CategoryID>
    <CategoryName>Book</CategoryName>
    <ItemName>PHP</ItemName>
    <ItemDetails>PHP12345</ItemDetails>
</Item>
<Item>
    <CategoryID>2</CategoryID>
    <CategoryName>Tool</CategoryName>
    <ItemName>ToolAbcde</ItemName>
    <ItemDetails>sth details</ItemDetails>
</Item></ItemList>

Новый XML

<NewXML>
<Category>
    <CategoryID>1</CategoryID>
    <CategoryName>Book</CategoryName>
    <ItemList>
        <Item>
            <ItemName>ASP.NET</ItemName>
            <ItemDetails>ASP.NET12345</ItemDetails>
        </Item>
        <Item>
            <ItemName>PHP</ItemName>
            <ItemDetails>PHP12345</ItemDetails>
        </Item>
        <ItemName>PHP</ItemName>
    </ItemList>
</Category>
<Category>
    <CategoryID>2</CategoryID>
    <CategoryName>Tool</CategoryName>
    <ItemList>
        <Item>
            <ItemName>ToolAbcde</ItemName>
            <ItemDetails>sth details</ItemDetails>
        </Item>
    </ItemList>
</Category></NewXML>

1 Ответ

7 голосов
/ 04 июля 2010

Спецификация xslt содержит подробные пояснения по группировке, дополненные примерами по http://www.w3.org/TR/xslt20/#xsl-for-each-group.. Возможно, вам нужны функции current-group() и current-grouping-key(). Также

В конструкторе последовательности, элемент контекста является начальным элементом соответствующей группы , позиция контекста является позицией этого элемента среди последовательности начальных элементов (один элемент для каждой группы), расположенных в порядок обработки групп, размер контекста - это количество групп, текущая группа - это обрабатываемая группа, а текущий ключ группировки - это ключ группировки для этой группы.

Это означает, что эти два выражения будут эквивалентны внутри xsl: for-each-group: CategoryId и current-group()[1]/CategoryId. Поскольку CategoryId является ключом группировки, он также совпадает с current-grouping-key(). Вот полный пример вашего варианта использования:

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

    <xsl:output method="xml" indent="yes" encoding="utf-8" />

    <xsl:template match="/">
        <NewXml>
            <xsl:for-each-group select="ItemList/Item" group-by="CategoryID">
                <Category>
                    <CategoryID><xsl:value-of select="CategoryID" /></CategoryID>
                    <CategoryName><xsl:value-of select="CategoryName" /></CategoryName>
                    <ItemList>
                        <xsl:for-each select="current-group()">
                            <Item>
                                <ItemName><xsl:value-of select="ItemName" /></ItemName>
                                <ItemDetails><xsl:value-of select="ItemDetails" /></ItemDetails>
                            </Item>
                        </xsl:for-each>
                    </ItemList>
                </Category>
            </xsl:for-each-group>
        </NewXml>
    </xsl:template>

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