Как мне получить определенный элемент XML на основе его дочерних элементов в XSLT 2.0? - PullRequest
0 голосов
/ 21 декабря 2011

Это мой XML-документ (небольшой фрагмент).

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<w:document xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main">

<w:body>
    <w:p> <!-- Current Node -->
        <w:r>
            <w:t>
                 This is the
            </w:t>
        </w:r>
        <w:r>
            <w:pict>
                <w:p>
                    <w:r>
                        <w:t>
                            I dont need this
                        </w:t>
                    </w:r>
                </w:p>
            </w:pict>
        </w:r>

        <w:r>
            <w:pict>
                <w:p>
                    <w:r>
                        <w:t>
                            I dont need this too
                        </w:t>
                    </w:r>
                </w:p>
            </w:pict>
        </w:r>

        <w:r>
            <w:t>
                 text that i need to retrieve...
            </w:t>
        </w:r>
    </w:p>
</w:body>
</w:document>   

Здесь я хочу получить значение <w:r><w:t>, и в нем <w:r> не должно быть дочернего элемента <w:pict>. Итак, согласно моему приведенному выше XML-документу, я хочу сгенерировать следующий вывод:

<paragraph>This is the text that i need to retrieve...</paragraph>

и это мой фрагмент XSLT (скажите, пожалуйста, какие изменения требует этот XSLT для получения вышеуказанного формата):

<xsl:choose>
    <xsl:when test="self::w:p[//w:r/w:t[not(ancestor::w:pict)]]">

        <Paragraph>
            <xsl:apply-templates select="./w:t[not(ancestor::w:pict)]" />
        </Paragraph>
    </xsl:when>
</xsl:choose>

<xsl:template match="w:t">
    <xsl:value-of select="." />
</xsl:template>

но это не работает ...

Пожалуйста, помогите мне выйти из этого вопроса.

Ответы [ 3 ]

1 голос
/ 21 декабря 2011

Если вы обрабатываете это классическим способом XSLT с использованием рекурсивного спуска сверху вниз с помощью xsl: apply-templates, то способ исключения w: r с дочерним элементом w: pict выглядит следующим образом:

<xsl:template match="w:r[w:pict]"/>

Кажется, я помню случай, когда я хотел исключить w: r, если его единственный дочерний элемент был w: pict. В этом случае решение будет

<xsl:template match="w:r[w:pict and count(*)=1]"/>
1 голос
/ 21 декабря 2011

В вашем текущем примере, если ваш текущий узел /w:document/w:body/w:p, вы можете получить все нужные вам узлы с помощью:

w:r/w:t

Однако, если вам нужно получить w:r/w:t на любом уровне, но безw:pict как предок, вы можете использовать ось ancestor как таковую:

.//w:r/w:t[not(ancestor::w:pict)]
0 голосов
/ 22 декабря 2011

Вы также можете использовать фильтрацию для извлечения всех w:r узлов, которые не имеют w:pict элемента

<xs:for-each select="//w:r[count(w:pict) = 0]">
    <xsl:value-of select="w:paragraph" />
</xsl:for-each>
...