Гость
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / Группировку на XSLT / 4 сообщений из 4, страница 1 из 1
23.03.2014, 13:42
    #38593912
wizzzi
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Группировку на XSLT
Пишу группировку на 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
23.03.2014, 13:44
    #38593915
wizzzi
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Группировку на XSLT
Не понимаю, как правильно расставить namespace.
...
Рейтинг: 0 / 0
23.03.2014, 13:50
    #38593918
wizzzi
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Группировку на XSLT
Еще интересует, как прикрутить сюда подсчет книг у данного автора и общее количество книг.
...
Рейтинг: 0 / 0
24.03.2014, 01:46
    #38594116
petalvik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Группировку на XSLT
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
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / Группировку на XSLT / 4 сообщений из 4, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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