powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / Фильтрация XML документа по условию
8 сообщений из 8, страница 1 из 1
Фильтрация XML документа по условию
    #39264098
Degun
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть некоторый XML-документ. Необходимо с помощью XSL-преобразования отфильтровать этот документ так, чтобы в нём остались записи, у которых есть атрибуты с определённым значением. Например, есть исходный XML-документ:
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
<?xml version="1.0" encoding="windows-1251"?>
<DOC xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
	<DOC_REQUISITES DOC_DATE="2016-06-24" DOC_NO="009673064" DOC_TYPE_ID="TEST"/>
	<MQE ReportDate="2016-06-24" Weekday="Пятница" MainFirmId="123456789" FirmName="ООО Фирма">
		<TABLE TableId="JFSJ" TableName="Канц. товары">
			<SUBJECT Id="A1" SubjectShortName="Карандаш" PriceType="CASH">
				<RECORDS RecNo="1" ClientCode="User1" BuyDate="2016-06-24"/>
				<RECORDS RecNo="2" ClientCode="User2" BuyDate="2016-06-14"/>
				<RECORDS RecNo="3" ClientCode="User13" BuyDate="2016-06-05"/>
				<RECORDS RecNo="4" ClientCode="User17" BuyDate="2016-06-08"/>
			</SUBJECT>
			<SUBJECT Id="A2" SubjectShortName="Ластик" PriceType="CASH">
				<RECORDS RecNo="5" ClientCode="User2" BuyDate="2016-06-24"/>
				<RECORDS RecNo="6" ClientCode="User12" BuyDate="2016-06-24"/>
			</SUBJECT>
			<SUBJECT Id="A3" SubjectShortName="Ручка" PriceType="CASH">
				<RECORDS RecNo="7" ClientCode="User2" BuyDate="2016-06-17"/>
			</SUBJECT>
		</TABLE>
	</MQE>
</DOC>


В нём нужно оставить только те записи RECORDS, у которых ClientCode="User2". Т. е. на выходе должно получиться следующий XML-файл:
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
<?xml version="1.0" encoding="windows-1251"?>
<DOC xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
	<DOC_REQUISITES DOC_DATE="2016-06-24" DOC_NO="009673064" DOC_TYPE_ID="TEST"/>
	<MQE ReportDate="2016-06-24" Weekday="Пятница" MainFirmId="123456789" FirmName="ООО Фирма">
		<TABLE TableId="JFSJ" TableName="Канц. товары">
			<SUBJECT Id="A1" SubjectShortName="Карандаш" PriceType="CASH">
				<RECORDS RecNo="2" ClientCode="User2" BuyDate="2016-06-14"/>
			</SUBJECT>
			<SUBJECT Id="A2" SubjectShortName="Ластик" PriceType="CASH">
				<RECORDS RecNo="5" ClientCode="User2" BuyDate="2016-06-24"/>
			</SUBJECT>
			<SUBJECT Id="A3" SubjectShortName="Ручка" PriceType="CASH">
				<RECORDS RecNo="7" ClientCode="User2" BuyDate="2016-06-17"/>
			</SUBJECT>
		</TABLE>
	</MQE>
</DOC>


Как должен выглядеть шаблон преобразования?
...
Рейтинг: 0 / 0
Фильтрация XML документа по условию
    #39264238
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
    <xsl:template match="@* | node()">
        <xsl:copy>
            <xsl:apply-templates select="@* | node()"/>
        </xsl:copy>
    </xsl:template>
  
  <xsl:template match="RECORDS">
    <xsl:if test="@ClientCode=2">
      <xsl:copy>
        <xsl:apply-templates select="@* | node()"/>
      </xsl:copy>
    </xsl:if>
  </xsl:template>
...
Рейтинг: 0 / 0
Фильтрация XML документа по условию
    #39264440
Degun
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Это преобразование выдаёт следующий результат:
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
<?xml version="1.0" encoding="utf-8"?>
<DOC xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
	<DOC_REQUISITES DOC_DATE="2016-06-24" DOC_NO="009673064" DOC_TYPE_ID="TEST"></DOC_REQUISITES>
	<MQE ReportDate="2016-06-24" Weekday="Пятница" MainFirmId="123456789" FirmName="ООО Фирма">
		<TABLE TableId="JFSJ" TableName="Канц. товары">
			<SUBJECT Id="A1" SubjectShortName="Карандаш" PriceType="CASH">
			</SUBJECT>
			<SUBJECT Id="A2" SubjectShortName="Ластик" PriceType="CASH">
			</SUBJECT>
			<SUBJECT Id="A3" SubjectShortName="Ручка" PriceType="CASH">
			</SUBJECT>
		</TABLE>
	</MQE>
</DOC>


Т. е. отфильтровываются все записи RECORDS
...
Рейтинг: 0 / 0
Фильтрация XML документа по условию
    #39264474
Degun
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Понял в чём неточность. Вот подкорректированный вариант преобразования:
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
<?xml version="1.0" encoding="windows-1251"?>
<xsl:stylesheet version="1.1" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >

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

	<xsl:template match="RECORDS">
		<xsl:if test="@ClientCode='User2'">
			<xsl:copy>
				<xsl:apply-templates select="@* | node()"/>
			</xsl:copy>
		</xsl:if>
	</xsl:template>

</xsl:stylesheet>
...
Рейтинг: 0 / 0
Фильтрация XML документа по условию
    #39264587
Degun
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Единственный момент - результирующий XML получается в виде одной текстовой строки, т. е. без переноса каждого узла на отдельную строку. Как нужно изменить шаблон, чтобы выходной XML форматировался с переносом узлов на отдельные строки?
...
Рейтинг: 0 / 0
Фильтрация XML документа по условию
    #39264682
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: xml
1.
<xsl:output method="xml" indent="yes"/>
...
Рейтинг: 0 / 0
Фильтрация XML документа по условию
    #39264878
Degun
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Antonariy, спасибо большое.
Если не сложно, то посмотрите ещё такой вопрос. Как в преобразовании сделать так, чтобы из выходного XML-файла убрать те узлы, которые не содержат в конечном итоге записей RECORDS? Т. е. из такого XML-файла:
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
<?xml version="1.0" encoding="utf-8"?>
<DOC xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
	<DOC_REQUISITES DOC_DATE="2016-06-24" DOC_NO="009673064" DOC_TYPE_ID="TEST"></DOC_REQUISITES>
	<MQE ReportDate="2016-06-24" Weekday="Пятница" MainFirmId="123456789" FirmName="ООО Фирма">
		<TABLE TableId="JFSJ" TableName="Канц. товары">
			<SUBJECT Id="A1" SubjectShortName="Карандаш" PriceType="CASH">
			</SUBJECT>
			<SUBJECT Id="A2" SubjectShortName="Ластик" PriceType="CASH">
				<RECORDS RecNo="5" ClientCode="User2" BuyDate="2016-06-24"/>
			</SUBJECT>
			<SUBJECT Id="A3" SubjectShortName="Ручка" PriceType="CASH">
			</SUBJECT>
		</TABLE>
	</MQE>
</DOC>


должен формироваться такой
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
<?xml version="1.0" encoding="utf-8"?>
<DOC xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
	<DOC_REQUISITES DOC_DATE="2016-06-24" DOC_NO="009673064" DOC_TYPE_ID="TEST"></DOC_REQUISITES>
	<MQE ReportDate="2016-06-24" Weekday="Пятница" MainFirmId="123456789" FirmName="ООО Фирма">
		<TABLE TableId="JFSJ" TableName="Канц. товары">
			<SUBJECT Id="A2" SubjectShortName="Ластик" PriceType="CASH">
				<RECORDS RecNo="5" ClientCode="User2" BuyDate="2016-06-24"/>
			</SUBJECT>
		</TABLE>
	</MQE>
</DOC>
...
Рейтинг: 0 / 0
Фильтрация XML документа по условию
    #39264913
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: xml
1.
2.
3.
4.
5.
6.
7.
        <xsl:template match="SUBJECT">
		<xsl:if test="RECORDS">
			<xsl:copy>
				<xsl:apply-templates select="@* | node()"/>
			</xsl:copy>
		</xsl:if>
	</xsl:template>
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / Фильтрация XML документа по условию
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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