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

Прошу помочь разобраться с 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
XSLT: корректно добавить атрибуты
    #38858676
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
av84
Код: xml
1.
="@color*">

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

Вот шаблон по умолчанию, который создает вижуал студия:
Код: 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
XSLT: корректно добавить атрибуты
    #38859218
av84
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
_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
XSLT: корректно добавить атрибуты
    #38859712
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
XSLT: корректно добавить атрибуты
    #38860278
av84
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
_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
6 сообщений из 6, страница 1 из 1
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / XSLT: корректно добавить атрибуты
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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