Как получить доступ к элементам из внешнего цикла из вложенных циклов? - PullRequest
20 голосов
/ 17 января 2009

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

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

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

Я продолжаю писать код, подобный этому:

<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>

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

Ответы [ 3 ]

26 голосов
/ 17 января 2009

Вы можете сохранить всю структуру / 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>
8 голосов
/ 17 января 2009

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

0 голосов
/ 10 декабря 2015

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

    <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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...