2017-01-06 14 views
0
  <p> 
      <p1>c</p1> 
      <a languageCode="en">a1</a> 
      <a languageCode="de">a2</a> 
      <ca> 
       <cc>056</cc> 
       <cs>BE-VAN</cs> 
       <cs>BG-VLI</cs> 
       <cs>BG-VLI</cs> 
      </ca> 
      <ca> 
       <cc>056</cc> 
       <cs>BE-VAN</cs> 
       <cs>BG-VLI</cs> 
       <cs>BG-VLI</cs> 
      </ca> 
     </p> 

я попытался это не работает:Найти предшествующую-родственный родительского элемента в XSLT

<xsl:for-each select="p/ca/*"> 
    <xsl:if test="not(preceding-sibling::*[1]/name() = local-name())"> 
      <precedingParent n="{preceding-sibling::*[1]/parent::*/name()}"></precedingParent> 
    </xsl:if> 
</xsl:for-each> 

но ожидается вывод должен быть:

<precedingParent n="a"></precedingParent> 

Я зацикливание в са и например, при первом появлении cs Если требуется найти предыдущего родителя для родительского элемента ca для элемента cs? как мне это сделать?

+0

Вы можете показать соответствующую часть вашего XSLT-кода, просто чтобы мы могли убедиться в правильном контексте. Спасибо! –

+0

@TimC Я обновил вопрос, можете ли вы мне помочь? – divya

ответ

2

Выражение, которое вы ищете, является ../preceding-sibling::*[1]/name(). Например,

<xsl:for-each select="p/ca/*"> 
     <xsl:if test="not(preceding-sibling::*[1]/name() = local-name())"> 
      <precedingParent n="{../preceding-sibling::*[1]/name()}"></precedingParent> 
     </xsl:if> 
    </xsl:for-each> 

Обратите внимание, что name(../preceding-sibling::*[1]) также будет работать (в XSLT 1.0 и XSLT 2.0).

С другой стороны, вы могли бы быть немного более эффективным при наличии вложенного цикла, и получить предыдущее значение, прежде чем выбрать дочерние элементы, чтобы сохранить его необходимости пересчитывается каждый раз:

<xsl:for-each select="p/ca"> 
     <xsl:variable name="precedingParent" select="name(preceding-sibling::*[1])" /> 
     <xsl:for-each select="*"> 
      <xsl:if test="not(preceding-sibling::*[1]/name() = local-name())"> 
       <precedingParent n="{$precedingParent}"></precedingParent> 
      </xsl:if> 
     </xsl:for-each>   
    </xsl:for-each>  
+0

круто это работает. – divya