Подтвердить что ты не робот

Как получить доступ к элементам из внешнего цикла из вложенных циклов?

Я вложен xsl: для циклов:

<xsl:for-each select="/Root/A">
    <xsl:for-each select="/Root/B">
        <!-- Code -->
    </xsl:for>
</xsl:for>

Внутри внутреннего цикла, как я могу получить доступ к атрибутам из текущего node во внешнем цикле?

Я все время нахожу, что пишу код следующим образом:

<xsl:for-each select="/Root/A">
    <xsl:variable name="someattribute" select="@SomeAttribute"/>
    <xsl:for-each select="/Root/B">
        <!-- Now can use $someattribute to access data from 'A' -->
    </xsl:for>
</xsl:for>

Это не очень хорошо масштабируется, так как иногда мне нужно получить доступ к нескольким частям информации и создать одну переменную для каждой части. Есть ли более простой способ?

4b9b3361

Ответ 1

Вы можете хранить всю структуру /Root/A в переменной и ссылаться на эту переменную, а не создавать новую переменную для каждого атрибута и подэлемента, к которому вы должны получить доступ.

<xsl:for-each select="/Root/A/">
    <xsl:variable name="ROOT_A" select="."/>
    <xsl:for-each select="/Root/B/">
         <!-- Variable is accessed like this: $ROOT_A/@someAttribute
              Just like a normal XML node -->
    </xsl:for-each>
</xsl:for-each>

Ответ 2

Welbog ответил на это хорошо - но только для того, чтобы отметить, что вы делаете картографическое соединение (крест) - это намеренно? Если вы пытаетесь выполнить регулярное соединение (с предикатом и т.д.), То вы хотите посмотреть в <xsl:key/> - то есть объявить ключ:

<xsl:key name="BIndex" match="/Root/B" use="SomeChildNode"/>

затем потребляйте в своем предикате:

<xsl:for-each select="/Root/A/">
    <xsl:variable name="ROOT_A" select="."/>
    <xsl:for-each select="key('BIndex', LocalNode)">
     <!-- -->
    </xsl:for-each>
</xsl:for-each>

Это должно быть эквивалентно (но намного быстрее) предиката:

    <xsl:for-each select="/Root/B[SomeChildNode = current()/LocalNode]">

Если вы группируете данные, посмотрите Muenchian grouping

Ответ 3

Можно также использовать следующее:

    <xsl:for-each select="ns:attribute">
        <name><xsl:value-of select="ns:name" /></name>              
        <xsl:for-each select="ns:value">
        <value><xsl:value-of select="."/></value>       
        </xsl:for-each>
    </xsl:for-each>      

Для анализа XML-документа..

 <ns:attribute>
      <ns:name>name</ns:name>
      <!--1 or more repetitions:-->
      <ns:value>Rahul</ns:value>
      <ns:value>Sushovan</ns:value>
</ns:attribute>