Гость
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / XSLT: корректно добавить атрибуты / 6 сообщений из 6, страница 1 из 1
20.01.2015, 15:49
    #38858610
av84
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XSLT: корректно добавить атрибуты
Привет всем.

Прошу помочь разобраться с XSLT.

Стоит задача выбрать определённый набор узлов из HTML-документа и преобразовать его - обернуть каждый узел в div и span.
К примеру:
Код: html
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
<div>
        <h1 color="red" font-weight="bold">head 1</h1>
        <h2 color="blue" font-style="italic">head 2</h2>
        <p border-style="double">Paragraph</p>
        <div class="div">
            <p class="subp">Sub paragraph</p>
            <div class="subdiv">
                <span>span</span>
                <p class="subsubp">Sub sub paragraph<span>Sub sub span</span></p>
            </div>
        </div>
</div>



У узлов будет множество атрибутов. В этом вся загвоздка.

Пишу xsl-документ:

Код: 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.
    <xsl:template match="/">
        <sheet>
            <xsl:apply-templates select="//h1 | //h2 | //h5 | //p | //tr />
        </sheet> 
    </xsl:template>
      

            
    <xsl:template match="*"> 
        <xsl:choose>
            
            <xsl:when test="name() = 'tr'">
                <xsl:element name="div">       
                    <xsl:apply-templates select="./td | ./th"/>   
                </xsl:element>                   
            </xsl:when>
                                
            <xsl:otherwise>
                <xsl:element name="div">          
                    <xsl:element name="span"> 
                        <xsl:value-of select="."/>
                    </xsl:element>
                </xsl:element>                  
            </xsl:otherwise>
                        
        </xsl:choose> 

    </xsl:template>      
    
    
    
    <xsl:template match="tr/td"> 
        <xsl:element name="span">    
            <xsl:value-of select="."/>
        </xsl:element>        
    </xsl:template>
    
    <xsl:template match="tr/th"> 
        <xsl:element name="span">    
            <xsl:value-of select="."/>
        </xsl:element>        
    </xsl:template> 




Всё хорошо "оборачивается". Но как только я пытаюсь добавить или скопировать атрибуты, сразу же лезут ошибки.
К примеру, если пишу

Код: xml
1.
2.
3.
4.
5.
<xsl:template match="@color*">
 <xsl:copy>
  <xsl:apply-templates select="@color*"/>
 </xsl:copy>
</xsl:template>     



выдаётся
"XSLTProcessor::importStylesheet(): element template only allowed as child of stylesheet"
и
"XSLTProcessor::importStylesheet(): XSLT-apply-templates: could not compile select expression '@color*'"

Идеальный вариант был бы через for-each прогнать все атрибуты и скопировать/создать их, но ничего не выходит.

Стоит ли что-то существенно переделать, избавившись от цикла, или дополнить текущий функционал?
Буду очень признателен за помощь.
...
Рейтинг: 0 / 0
20.01.2015, 16:34
    #38858676
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XSLT: корректно добавить атрибуты
av84
Код: xml
1.
="@color*">

Что Вы хотели этим сказать? * зачем? Пишите или @* или @color
...
Рейтинг: 0 / 0
20.01.2015, 16:39
    #38858688
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XSLT: корректно добавить атрибуты
Фигня какая-то понаписана.

Вот шаблон по умолчанию, который создает вижуал студия:
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
<?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="msxsl">
    <xsl:output method="xml" indent="yes"/>

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

Он делает копию всего 1 в 1.

Если нужно, например tr заменить на div, то к нему дописывается:
Код: xml
1.
2.
3.
4.
5.
6.
7.
  <xsl:template match="tr">
    <div>
      <xsl:copy>
        <xsl:apply-templates select="@* | node()"/>
      </xsl:copy>
    </div>
  </xsl:template>

Тоже самое с td и th:
Код: xml
1.
2.
3.
4.
5.
6.
7.
  <xsl:template match="td|th">
    <span>
      <xsl:copy>
        <xsl:apply-templates select="@* | node()"/>
      </xsl:copy>
    </span>
  </xsl:template>

Соответственно скопируются и атрибуты.
...
Рейтинг: 0 / 0
21.01.2015, 09:05
    #38859218
av84
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XSLT: корректно добавить атрибуты
_Vasilisk_,

авторЧто Вы хотели этим сказать? * зачем? Пишите или @* или @color

Прошу прощения. Эта * случайно попала в сообщение. Код без неё, и также не работает.



Antonariy,

не совсем скопировать.
Мне нужно пройтись по всем узлам документа, выбрать определённый набор узлов, и заменить:
- p, h1-h6 на div>span с таким же значением узлов, а атрибуты скопировать в span;
- tr на div;
- td на span.

То есть, к примеру, из документа:

Код: html
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
<div>
        <h1 color="red" font-weight="bold">head 1</h1>
        <h2 color="blue" font-style="italic">head 2</h2>
        <p border-style="double">Paragraph</p>
        <div class="div">
            <p class="subp">Sub paragraph</p>
            <div class="subdiv">
                <span>span</span>
                <p class="subsubp">Sub sub paragraph<span>Sub sub span</span></p>
            </div>
        </div>
</div>
<table>
  <thead>
      <tr>
          <td>a11</td>
          <td>b22</td>
      </tr>
      <tr>
          <td>c33</td>
          <td>d44</td>
      </tr>      
  </thead>
</table>  



нужно получить

Код: html
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
        <div><span color="red" font-weight="bold">head 1</span></div>
        <div><span color="blue" font-style="italic">head 2</span></div>
        <div><span border-style="double">Paragraph</span></div>
        <div><span class="subp">Sub paragraph</span></div>
        <div><span class="subsubp">Sub sub paragraph</span></div>
      <div>
          <span>a11</span>
          <span>b22</span>
      </div>
      <div>
          <span>c33</span>
          <span>d44</span>
      </div> 



Узлы заменяются, а атрибуты не выходит скопировать.
...
Рейтинг: 0 / 0
21.01.2015, 14:18
    #38859712
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XSLT: корректно добавить атрибуты
av84Эта * случайно попала в сообщение.И она же случайно попала в сообщение об ошибке?
av84"XSLTProcessor::importStylesheet(): XSLT-apply-templates: could not compile select expression '@color*'"
av84а атрибуты не выходит скопировать.Что из этого
Antonariy
Код: xml
1.
2.
3.
4.
5.
    <xsl:template match="@*">
        <xsl:copy>
            <xsl:apply-templates />
        </xsl:copy>
    </xsl:template>

у Вас не получается?
...
Рейтинг: 0 / 0
22.01.2015, 08:20
    #38860278
av84
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XSLT: корректно добавить атрибуты
_Vasilisk_ ,

скорее всего это потому, что элемент не был дочерним по отношению к stylesheet ("element template only allowed as child of stylesheet").
Спасибо вам за уделённое внимание.

Мне подсказали, как это можно реализовать. Если вдруг кому-то пригодится:

Код: 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.
<?xml version="1.0" encoding="utf-8"?>  
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" indent="yes"/>
  <xsl:template match="*">
    <xsl:apply-templates select="*"/>
  </xsl:template>
  <xsl:template match="/*">
    <xsl:copy>
      <xsl:apply-templates/>
    </xsl:copy>
  </xsl:template>
 
  <xsl:template match="p|h1|h2|h3|h4|h5|h6">
    <div>
      <span>
        <xsl:for-each select="@*">
          <xsl:copy-of select="."/>
        </xsl:for-each>
        <xsl:apply-templates/>
        </span>
    </div>  
  </xsl:template>
  <xsl:template match="tr">
    <div>
      <xsl:apply-templates/>
    </div>
  </xsl:template>
  <xsl:template match="td">
    <span>
      <xsl:apply-templates/>
    </span>
  </xsl:template>
  
</xsl:stylesheet>
...
Рейтинг: 0 / 0
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / XSLT: корректно добавить атрибуты / 6 сообщений из 6, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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