powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / Группировку на XSLT
4 сообщений из 4, страница 1 из 1
Группировку на XSLT
    #38593912
wizzzi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пишу группировку на XSLT. Сначало начал на таком примере:
Исходный XML файл:
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
<?xml version="1.0" encoding="utf-8"?>
<Catalog>
  <Book>
    <Title>AAAA2</Title>
    <Page>123</Page>
    <Author>BBBB</Author>
    <City>CCC</City>
    <Issue>DDDD</Issue>
    <DateIssue>2014-03-23T00:00:00+04:00</DateIssue>
    <PS>dddd</PS>
    <ISBN>789-1-12-123456-2</ISBN>
  </Book>
  <Book>
    <Title>AAAA2</Title>
    <Page>123</Page>
    <Author>BBBB</Author>
    <City>CCC</City>
    <Issue>DDDD</Issue>
    <DateIssue>2014-03-23T00:00:00+04:00</DateIssue>
    <PS>dddd</PS>
    <ISBN>789-1-12-123456-2</ISBN>
  </Book>
</Catalog>


для него написал такой XSLT
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:msxsl="urn:schemas-microsoft-com:xslt"    
    exclude-result-prefixes="user msxsl"
    xmlns:user="urn:my-scripts"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:ns="https://Kashin/CatalogSchemaSerializ.xsd"
>  
  <xsl:key name="ProductId" match="Catalog/Book" use ="Author"/>
  <xsl:output omit-xml-declaration="yes" method="xml" version="1.0" />
  
  <xsl:template match="/">
    <xsl:apply-templates select="Catalog" />
  </xsl:template>

  <xsl:template match="Catalog">
    <xsl:element name="BookCollection">
        <xsl:for-each select="Book">
          <xsl:variable name="group" select="key('ProductId', Author)"/>
          <xsl:if test="generate-id($group[1]) = generate-id()">
            <xsl:element name="AuthorBook">
              <xsl:attribute name="Автор">
                <xsl:value-of select="Author"/>
              </xsl:attribute>
              <xsl:for-each select="$group">
                <xsl:element name="BookTitle">
                  <xsl:attribute name="Название">
                    <xsl:value-of select="Title"/>
                  </xsl:attribute>
                </xsl:element>
              </xsl:for-each>
            </xsl:element>
          </xsl:if>
        </xsl:for-each>
      </xsl:element>
  </xsl:template>
</xsl:stylesheet>


все работает как надо, теперь нужно переделать его под мой настоящий XML файл:
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
<Catalog xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="https://Kashin/CatalogSchemaSerializ.xsd">
  <CatalogItem xsi:type="Book">
    <Title>AAAA1</Title>
    <Page>10</Page>
    <Author>AAAA</Author>
    <City>CCC</City>
    <Issue>DDDD</Issue>
    <DateIssue>2014-03-23T00:00:00+04:00</DateIssue>
    <PS>dddd</PS>
    <ISBN>789-1-12-123456-1</ISBN>
  </CatalogItem>
  <CatalogItem xsi:type="Book">
    <Title>AAAA</Title>
    <Page>10</Page>
    <Author>AAAA</Author>
    <City>CCC</City>
    <Issue>DDDD</Issue>
    <DateIssue>2014-03-23T00:00:00+04:00</DateIssue>
    <PS>dddd</PS>
    <ISBN>789-1-12-123456-3</ISBN>
  </CatalogItem>
</Catalog>


Что то, как не пытался, не получается(
...
Рейтинг: 0 / 0
Группировку на XSLT
    #38593915
wizzzi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не понимаю, как правильно расставить namespace.
...
Рейтинг: 0 / 0
Группировку на XSLT
    #38593918
wizzzi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Еще интересует, как прикрутить сюда подсчет книг у данного автора и общее количество книг.
...
Рейтинг: 0 / 0
Группировку на XSLT
    #38594116
petalvik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wizzzi,

достаточно добавить префикс ns. У меня получилось так:
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:msxsl="urn:schemas-microsoft-com:xslt"
                exclude-result-prefixes="user msxsl"
                xmlns:user="urn:my-scripts"
                xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                xmlns:ns="https://Kashin/CatalogSchemaSerializ.xsd"
>
  <xsl:key name="ProductId" match="ns:Catalog/ns:CatalogItem[@xsi:type='Book']" use="ns:Author"/>
  <xsl:output omit-xml-declaration="yes" method="xml" version="1.0"/>
  
  <xsl:template match="ns:Catalog">    
    <xsl:element name="ns:BookCollection">
      
      <xsl:element name="TotalCount">
        <xsl:value-of select="count(ns:CatalogItem[@xsi:type='Book'])"/>
      </xsl:element>
      
      <xsl:for-each select="ns:CatalogItem">
        <xsl:variable name="group" select="key('ProductId', ns:Author)"/>
        <xsl:if test="generate-id($group[1]) = generate-id()">
          <xsl:element name="AuthorBook">
            
            <xsl:attribute name="Автор">
              <xsl:value-of select="ns:Author"/>
            </xsl:attribute>
            
            <xsl:attribute name="Count">
              <xsl:value-of select="count($group)"/>
            </xsl:attribute>
            
            <xsl:for-each select="$group">
              <xsl:element name="BookTitle">
                <xsl:attribute name="Название">
                  <xsl:value-of select="ns:Title"/>
                </xsl:attribute>
              </xsl:element>
            </xsl:for-each>
            
          </xsl:element>
        </xsl:if>
      </xsl:for-each>
      
    </xsl:element>
  </xsl:template>
  
</xsl:stylesheet>


Что-то у меня не получается сделать подсчёт общего количества книг, используя ключ. Написал, используя XPath. Пожалуй, это невыгодно, т. к. снова происходит пробег по всему документу, хотя он уже происходил при вычислении ключа.

Припоминая прошлый вопрос в другом разделе, добавил проверку атрибута xsi:type, чтобы отсечь значения patent, newspaper, etc.
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / Группировку на XSLT
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]