Гость
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / Исключить все (вверх по иерархии) элементы не имеющие определенных детей / 5 сообщений из 5, страница 1 из 1
04.05.2012, 18:31
    #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
04.05.2012, 18:41
    #37782689
Michael Z.
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Исключить все (вверх по иерархии) элементы не имеющие определенных детей
Так тоже все записи
select="ROOT[//LogicalOperation[count(*)>0]]">
...
Рейтинг: 0 / 0
05.05.2012, 01:02
    #37783005
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Исключить все (вверх по иерархии) элементы не имеющие определенных детей
Michael Z.,

Код: xml
1.
<xsl:template match="LogicalOperation[not(.//ComparsionExpression)]"/>
...
Рейтинг: 0 / 0
05.05.2012, 13:10
    #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
07.05.2012, 14:17
    #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
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / Исключить все (вверх по иерархии) элементы не имеющие определенных детей / 5 сообщений из 5, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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