xslt - выводит результат от детей - PullRequest
0 голосов
/ 05 октября 2009

С учетом следующего XML-ввода:

<Sections>
 <Section number="1">       
  <Step number="1">
   <SubStep number="1" Pass="True">             
    <SubSubStep number="1" Pass="True"/>                    
    <SubSubStep number="2" Pass="True"/>                    
   </SubStep>
  </Step>
  <Step number="2">
   <SubStep number="1" Pass="False">                
    <SubSubStep number="1" Pass="True"/>                    
    <SubSubStep number="2" Pass="False"/>                   
   </SubStep>
  </Step>
 </Section>
</Sections>

Как я могу преобразовать его в:

<Sections Pass="False">
 <Section number="1" Pass="False">      
  <Step number="1" Pass="True">
   <SubStep number="1" Pass="True">             
    <SubSubStep number="1" Pass="True"/>                    
    <SubSubStep number="2" Pass="True"/>                    
   </SubStep>
  </Step>
  <Step number="2" Pass="False">
   <SubStep number="1" Pass="False">                
    <SubSubStep number="1" Pass="True"/>                    
    <SubSubStep number="2" Pass="False"/>                   
   </SubStep>
  </Step>
 </Section>
</Sections>

Я хочу вывести результат родителя из детей. Если какой-либо из детей имеет результат Pass = "False", родительским результатом будет Pass = "False" Обратная рекурсия?

Ответы [ 2 ]

0 голосов
/ 05 октября 2009

Вы можете сделать это следующим образом:

  1. Используйте тождественное преобразование , чтобы скопировать все с входа на выход, и

  2. для узлов элементов без атрибута Pass, добавьте его. Установите значение False, если в дочерних элементах есть хотя бы один атрибут Pass со значением False, а в противном случае - True.


<xsl:stylesheet version="1.0"
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output omit-xml-declaration="yes"/>

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

  <!-- set missing Pass attribute -->
  <xsl:template match="*[not(@Pass)]">
    <xsl:copy>
      <xsl:apply-templates select="@*"/>
      <xsl:attribute name="Pass">
        <xsl:choose>
          <xsl:when test=".//*[@Pass = 'False']">False</xsl:when>
          <xsl:otherwise>True</xsl:otherwise>
        </xsl:choose>
      </xsl:attribute>
      <xsl:apply-templates select="node()"/>
    </xsl:copy>
  </xsl:template>

</xsl:stylesheet>
0 голосов
/ 05 октября 2009

Вы можете использовать выражение XPath ".//node()[ @Pass='True' ]", чтобы узнать, являются ли какие-либо дочерние элементы текущего узла "True".

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...