powered by simpleCommunicator - 2.0.46     © 2025 Programmizd 02
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / Нужно сделать преобразование для xml документа
2 сообщений из 2, страница 1 из 1
Нужно сделать преобразование для xml документа
    #39878646
overdd
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день!

Решаю одну задачу, полный затык. Не срабатывают даже оригинальные вещи, а-ля вырезка отдельных нодов.
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
  <!-- Выводим все, что есть в исходнике xml-->	
  <xsl:template match="node() | @*">
    <xsl:copy>
      <xsl:apply-templates select="@* | node()"/>
    </xsl:copy>   
  </xsl:template>
  <!-- Вот такая вырезка не работает-->		  
  <xsl:template match="//HotelInfo" />



Исходный 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.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="Task3.xsl"?>
<OTA_HotelDescriptiveInfoRS xmlns="http://www.opentravel.org/OTA/2003/05"
	EchoToken="tok1" Version="2">

	<HotelDescriptiveContents>
	    
		<HotelDescriptiveContent HotelCityCode="UK.LON"
			HotelCode="YYL" HotelCodeContext="travco" HotelName="County London (Testing)">
			<HotelInfo>
				<Descriptions>
					<MultimediaDescriptions>
						<MultimediaDescription>
							<ImageItems>
								<ImageItem>
									<ImageFormat>
										<URL>http://www.travco.co.uk/images/hotels/YYL/YYL_front.jpg
										</URL>
									</ImageFormat>
									<Description Caption="front" />
								</ImageItem>
								<ImageItem>
									<ImageFormat>
										<URL>http://www.travco.co.uk/images/hotels/YYL/YYL_bed.jpg
										</URL>
									</ImageFormat>
									<Description Caption="rooms" />
								</ImageItem>
								<ImageItem>
									<ImageFormat>
										<URL>http://www.travco.co.uk/images/hotels/YYL/YYL_map.jpg
										</URL>
									</ImageFormat>
									<Description Caption="map" />
								</ImageItem>
							</ImageItems>
						</MultimediaDescription>
						<MultimediaDescription>
							<TextItems>
								<Description>*** Please note that name changes are not
									permitted to any bookings made at this hotel.***

									The County is a small, friendly and economic hotel, popular with
									budget-minded travellers. It is conveniently situated in the
									heart of London within easy walking distance from Euston and
									King's Cross stations as well as Covent Garden, Oxford Street
									and The British Museum. The bathrooms are communal, every four
									©, ¶, &#8721;, &#338; rooms shares one bathroom.</Description>
								<Description>ARRIVAL_POINT_NAME: no arrival
									pt, TUBE_STATION: Euston Tube Station (400m)</Description>
							</TextItems>
						</MultimediaDescription>
					</MultimediaDescriptions>
				</Descriptions>
				<Services>
					<Service Caption="78">
						<DescriptiveText>Security safe (at reception)
						</DescriptiveText>
					</Service>
					<Service Caption="158">
						<DescriptiveText>Bar(s)</DescriptiveText>
					</Service>
					<Service Caption="24">
						<DescriptiveText>Conference Facilities</DescriptiveText>
					</Service>
					<Service Caption="180">
						<DescriptiveText>Breakfast Room</DescriptiveText>
					</Service>
					<Service Caption="137">
						<DescriptiveText>Tea &amp; Coffee Equipment</DescriptiveText>
                    </Service>
                    <Service Caption="180">
                        <DescriptiveText>Television</DescriptiveText>
                    </Service>
                    <Service Caption="180">
                        <DescriptiveText>Radio</DescriptiveText>
                    </Service>
                </Services>
            </HotelInfo>
            <AffiliationInfo>
                <Awards>
                    <Award Provider="Hotel" Rating="1"/>
                </Awards>
            </AffiliationInfo>
            <ContactInfos>
                <ContactInfo>
                    <Addresses>
                        <Address>
                            <AddressLine>Upper Woburn Place</AddressLine>
                            <CityName>London</CityName>
                            <PostalCode>WC1H 0JW</PostalCode>
                        </Address>
                    </Addresses>
                    <Phones>
                        <Phone PhoneNumber="0044 (0)2073875544" PhoneTechType="1"/>
                        <Phone PhoneNumber="0044 (0)2078374653" PhoneTechType="3"/>
                    </Phones>
                    <Emails>
                        <Email>emcbride@travco.co.uk<;/Email>
                    </Emails>
                </ContactInfo>
            </ContactInfos>
        </HotelDescriptiveContent>
.............
    </HotelDescriptiveContents>
</OTA_HotelDescriptiveInfoRS>



И вот что нужно с ним сделать.
авторНеобходимо составить xml документ, содержащий :
1. Элементы с именами 'ContactInfo', 'MultimediaDescription' и 'ImageFormat' должны быть удалены, их потомки поднимаются на уровень выше (т.е. просто теряют родителя).
2. Элементы, в имени которых встречается сочетание 'rds', также должны быть удалены, с переносом их дочерних элементов на уровень выше.
3. Атрибут 'Caption', должен стать дочерним элементом (своего элемента).
4. Если элемент содержит несколько дочерних элементов 'Description', вывести следует только один, который содержит самый длинный текст.
5. Встречающиеся в тексте символы ©, ¶, ∑, Œ - удалить.
6. Элемент 'DescriptiveText' перевести в аттрибут, элемента 'Service'.
7. Все атрибуты и элементы, неупомянутые выше, скопировать без изменений.

Какую механику решения я рассматриваю:
1. Вывожу в шаблон дочерние ноды 'ContactInfo', 'MultimediaDescription' и 'ImageFormat' , затем 'ContactInfo', 'MultimediaDescription' и 'ImageFormat' вырезаю.
2. Вырезаю по шаблону <xsl:template match="//[test="*rds*"]" />
3.Проверяю условие через choose на наличие атрибута 'Caption'. Если есть, то вставляю нод 'Caption' как дочерний. Правда непонятно как это будет работать с выводом всего исходника (думаю будет конфликт)
Код: xml
1.
2.
3.
4.
5.
<xsl:template match="node() | @*">
    <xsl:copy>
      <xsl:apply-templates select="@* | node()"/>
    </xsl:copy>   
  </xsl:template>


4. Инициализируем param str. Поиск максимальной длины string-length('Description') и затем вывод его в древо.
5. Думаю, будет подходящий вариант с функцией translate() которая "переводит" указанные символы как "".
6. Тут пока что не придумал. Вижу в туториале, что можно создать атрибут вот так <xsl:attribute name="DescriptiveText">. Но тот ли это атрибут?


===============================================================================
Вот такие мысли. Помогите, пожалуйста!
...
Рейтинг: 0 / 0
Нужно сделать преобразование для xml документа
    #39879382
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: xml
1.
2.
3.
4.
5.
<xsl:stylesheet version="1.0" 
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
  xmlns:tr="http://www.opentravel.org/OTA/2003/05"
  exclude-result-prefixes="tr"
>


автор1. Элементы с именами 'ContactInfo', 'MultimediaDescription' и 'ImageFormat' должны быть удалены, их потомки поднимаются на уровень выше (т.е. просто теряют родителя).
Код: xml
1.
2.
3.
<xsl:template match="tr:ContactInfo | tr:MultimediaDescription | tr:ImageFormat">
  <xsl:apply-templates="node() | @*"/>
</xsl:template>


автор2. Элементы, в имени которых встречается сочетание 'rds', также должны быть удалены, с переносом их дочерних элементов на уровень выше.
Код: xml
1.
2.
3.
<xsl:template match="contains(local-name(), 'rds')">
  <xsl:apply-templates="node() | @*"/>
</xsl:template>


автор3. Атрибут 'Caption', должен стать дочерним элементом (своего элемента).
Код: xml
1.
2.
3.
4.
5.
<xsl:template match="@Caption">
  <xsl:element name="{local-name()}" namespace="{namespace-uri(..)}">
    <xsl:value-of select="."/>
  </xsl:element>
</xsl:template>


автор4. Если элемент содержит несколько дочерних элементов 'Description', вывести следует только один, который содержит самый длинный текст.
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
<xsl:template match="tr:Description">
  <xsl: if test="not(preceding-sibling::tr:Description)">
    <xsl:for-each select="../tr:Description">
      <xsl:sort select="string-length(.)" data-type="number" order="descending"/>
      <xsl:if test="position() = 1">
        <xsl:copy>
          <xsl:apply-templates="node() | @*"/>
        </xsl:copy>
      </xsl:if>
    </xsl:for-each>
  </xsl:if>
</xsl:template>


автор5. Встречающиеся в тексте символы ©, ¶, ∑, Œ - удалить.
Код: 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.
<xsl:template match="text()">
  <xsl:variable name="str1">
    <xsl:call-template name="removeChar">
      <xsl:with-param name="str" select="."/>
      <xsl:with-param name="char" select="'©'"/>
  </xsl:variable>
  <xsl:variable name="str2">
    <xsl:call-template name="removeChar">
      <xsl:with-param name="str" select="$str1"/>
      <xsl:with-param name="char" select="'¶'"/>
  </xsl:variable>
  <xsl:variable name="str3">
    <xsl:call-template name="removeChar">
      <xsl:with-param name="str" select="$str2"/>
      <xsl:with-param name="char" select="'&#8721;'"/>
  </xsl:variable>
  <xsl:variable name="str4">
    <xsl:call-template name="removeChar">
      <xsl:with-param name="str" select="$str3"/>
      <xsl:with-param name="char" select="'&#338;'"/>
  </xsl:variable>
  <xsl:value-of select="$str4"/>
</xsl:template>

<xsl:template name="removeChar">
  <xsl:param name="str">
  <xsl:param name="char">
  <xsl:variable name="res" select="concat(
    substring-before($str, $char), substring-after($str, $char)
  )">
  <xsl:choose>
    <xsl:when test="$res != ''>
      <xsl:value-of select="$res"/>
    </xsl:when>
    <xsl:otherwise>
      <xsl:value-of select="$str"/>
    </xsl:otherwise>
  <xsl:choose>
</xsl:template>


автор6. Элемент 'DescriptiveText' перевести в аттрибут, элемента 'Service'.
Код: xml
1.
2.
3.
4.
5.
<xsl:template match="tr:Service/tr:DescriptiveText">
  <xsl:attribute name="DescriptiveText">
    <xsl:value-of select="."/>
  </xsl:attribute>
</xsl:template>


автор7. Все атрибуты и элементы, неупомянутые выше, скопировать без изменений.
Код: xml
1.
2.
3.
4.
5.
<xsl:template match="node() | @*">
  <xsl:copy>
    <xsl:apply-templates select="node() | @*"/>
  </xsl:copy>   
</xsl:template>
...
Рейтинг: 0 / 0
2 сообщений из 2, страница 1 из 1
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / Нужно сделать преобразование для xml документа
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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