powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / Исключить все (вверх по иерархии) элементы не имеющие определенных детей
5 сообщений из 5, страница 1 из 1
Исключить все (вверх по иерархии) элементы не имеющие определенных детей
    #37782676
Michael Z.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть 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.
<ROOT IdTypeESN="70" SearchOnDate="2012-04-26" SearchMode="0" MatchCase="false">
 <Conditions>
  <LogicalOperation Id="-1" Operation="0">
   <LogicalOperation Id="-2" Operation="0">
    <LogicalOperation Id="-3" Operation="0">
     <LogicalOperation Id="-4" Operation="0">
      <LogicalOperation Id="-5" Operation="5">
       <LogicalOperation Id="-21" Operation="0"></LogicalOperation>
      </LogicalOperation>
     </LogicalOperation>
    </LogicalOperation>
    <ComparsionExpression Id="3" IdTypeESN="70" SelectionKind="-1" Operation="-1"></ComparsionExpression>
   </LogicalOperation>
   <LogicalOperation Id="-6" Operation="0">
    <LogicalOperation Id="-7" Operation="0">
     <LogicalOperation Id="-8" Operation="0">
      <LogicalOperation Id="-9" Operation="0">
       <LogicalOperation Id="-10" Operation="0">
        <ComparsionExpression Id="2" IdTypeESN="70" SelectionKind="-1" Operation="-1"></ComparsionExpression>
        <ComparsionExpression Id="1" IdTypeESN="77" SelectionKind="-1" Operation="-5"></ComparsionExpression>
       </LogicalOperation>
      </LogicalOperation>
     </LogicalOperation>
    </LogicalOperation>
   </LogicalOperation>
  </LogicalOperation>
 </Conditions>
</ROOT>



Необходимо исключить вверх по иерархии все элементы LogicalOperation которые не содержат дочерний элемент ComparsionExpression
в данном примере это элементы с Id in [-4, -5, -21]

Пробовал так:
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
<xsl:template match="/">
		<ROOT>
			<xsl:for-each select="ROOT[descendant::ComparsionExpression]">
          <xsl:copy-of select="@node()"/>
          <xsl:copy-of select="node()"/>
			</xsl:for-each>
		</ROOT>
	</xsl:template>



но все равно возвращаются все элементы.
По гуглу есть варианты как выкинуть определенные элементы, но как прикрутить к моей задаче не вкурил.
Выручайте
...
Рейтинг: 0 / 0
Исключить все (вверх по иерархии) элементы не имеющие определенных детей
    #37782689
Michael Z.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Так тоже все записи
select="ROOT[//LogicalOperation[count(*)>0]]">
...
Рейтинг: 0 / 0
Исключить все (вверх по иерархии) элементы не имеющие определенных детей
    #37783005
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Michael Z.,

Код: xml
1.
<xsl:template match="LogicalOperation[not(.//ComparsionExpression)]"/>
...
Рейтинг: 0 / 0
Исключить все (вверх по иерархии) элементы не имеющие определенных детей
    #37783535
mage.lan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
	<xsl:output method="xml" />
	<xsl:template match="/">
		<xsl:apply-templates select="/ROOT/Conditions/LogicalOperation" />
	</xsl:template>
	<xsl:template match="LogicalOperation">
		<xsl:if test=".//ComparsionExpression">
			<xsl:copy>
				<xsl:copy-of select="@*" />
				<xsl:apply-templates />
			</xsl:copy>
		</xsl:if>
	</xsl:template>
	<xsl:template match="ComparsionExpression">
		<xsl:copy-of select="." />
	</xsl:template>
</xsl:stylesheet>
...
Рейтинг: 0 / 0
Исключить все (вверх по иерархии) элементы не имеющие определенных детей
    #37785195
Michael Z.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем спасибо за ответы!!!
Окончательный вариант того, что было нужно (с перенумерацией отдельных узлов) получился таким (если кому интересно):
Код: 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.
<?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" version="1.0" encoding="UTF-8" indent="yes"/>
  <xsl:template match="ROOT//LogicalOperation/@*|node()">
    <xsl:copy>
      <xsl:copy-of select="@*"/>
      <xsl:apply-templates/>
    </xsl:copy>
  </xsl:template>
  <xsl:template match="LogicalOperation">
    <xsl:variable name="IdLO">
      <xsl:number level="any" count="LogicalOperation[descendant::ComparsionExpression]"/>
    </xsl:variable>
    <xsl:if test=".//ComparsionExpression">
      <xsl:copy>
        <xsl:attribute name="Id"><xsl:value-of select="-$IdLO"/></xsl:attribute>
        <xsl:copy-of select="@*"/>
        <xsl:apply-templates/>
      </xsl:copy>
    </xsl:if>
  </xsl:template>
  <xsl:template match="ComparsionExpression">
    <xsl:variable name="IdCE">
      <xsl:number level="any" count="ComparsionExpression"/>
    </xsl:variable>
    <xsl:copy>
      <xsl:attribute name="Id"><xsl:value-of select="$IdCE"/></xsl:attribute>
      <xsl:copy-of select="./@*"/>
    </xsl:copy>
  </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.
<?xml version="1.0" encoding="UTF-8"?>
<ROOT IdTypeESN="70" SearchOnDate="2012-04-26" SearchMode="0" MatchCase="false">
  <Conditions>
    <LogicalOperation Id="-1" Operation="0">
      <LogicalOperation Id="-2" Operation="0">
        <ComparsionExpression Id="1" IdTypeESN="70" SelectionKind="-1" Operation="-1"/>
      </LogicalOperation>
      <LogicalOperation Id="-3" Operation="0">
        <LogicalOperation Id="-4" Operation="0">
          <LogicalOperation Id="-5" Operation="0">
            <LogicalOperation Id="-6" Operation="0">
              <LogicalOperation Id="-7" Operation="0">
                <ComparsionExpression Id="2" IdTypeESN="70" SelectionKind="-1" Operation="-1"/>
                <ComparsionExpression Id="3" IdTypeESN="77" SelectionKind="-1" Operation="-5"/>
              </LogicalOperation>
            </LogicalOperation>
          </LogicalOperation>
        </LogicalOperation>
      </LogicalOperation>
    </LogicalOperation>
  </Conditions>
</ROOT>
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / Исключить все (вверх по иерархии) элементы не имеющие определенных детей
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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