выбирая каждый узел и братьев и сестер до следующего появления - PullRequest
0 голосов
/ 24 мая 2018

С этой структурой xml:

<doc>
    <members>
    <member name="T:XXX">
    </member>
    <member name="F:YYY">
    </member>
    <member name="P:ZZZ">
    </member>
    <member name="T:XXX">
    </member>
</doc>

Я пытаюсь получить все узлы, следующие за узлом с атрибутом имени, начиная с ' T: ', до следующего узла с атрибутом имени, начинающегося с ' T: '.

Основываясь на этой теме стекопотока ( # 40767321 ), я нашел почти идеальный ответ.

С xsl: key ниже, он берет первый узел T: и всех последователей, но также включает в себя следующий узел T: в выборе.Как я могу исключить это?

<xsl:key name="subMembers" match="member" use="generate-id(preceding-sibling::*[contains(@name, 'T:')][1])" />

Спасибо за вашу помощь!

1 Ответ

0 голосов
/ 24 мая 2018

В связанном разделе, который касается элементов ol, за которыми следуют элементы div, ключ соответствует только элементам div.Однако в вашем вопросе узлы T: представляют элементы ol, и ключ соответствует этим элементам.

Вам необходимо заменить ключ, чтобы игнорировать T: узлов

<xsl:key name="subMembers" match="member[not(starts-with(@name, 'T:'))]" use="generate-id(preceding-sibling::*[starts-with(@name, 'T:')][1])" />

Итак, если вы начнете с выбора узлов T: , вы выберете эти узлы и связанные с ними узлы, например:

 <xsl:copy-of select="self::*|key('subMembers', generate-id())" />

(Или вы можете использовать xsl:for-each или xsl:apply-templates, если вы также хотите преобразовать элементы группы).

Попробуйте это XSLT

<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:key name="subMembers" match="member[not(starts-with(@name, 'T:'))]" use="generate-id(preceding-sibling::*[starts-with(@name, 'T:')][1])" />

<xsl:template match="members">
    <members>
        <xsl:for-each select="member[starts-with(@name, 'T:')]">
            <group>
                <xsl:copy-of select="self::*|key('subMembers', generate-id())" />
            </group>
        </xsl:for-each>
    </members>
</xsl:template>

</xsl:stylesheet>
...