Как написать xpath для соответствия всем элементам, кроме определенного элемента - PullRequest
17 голосов
/ 01 февраля 2011

Я пишу XSL-преобразование.Я хочу написать шаблон, который соответствует всем дочерним элементам документа, кроме одного конкретного узла.Мой xml выглядит так -

<Document>
    <NodeA></NodeA>

    <NodeB></NodeB>

    <ServiceNode></ServiceNode>

    <NodeX></NodeX>
</Document>

Я хочу написать шаблон, который соответствует всем узлам, кроме ServiceNode, т.е. NodeA до NodeX.Как написать этот Xpath, чтобы получить -

<xsl:template match="ALL Nodex Except ServiceNode">

Ответы [ 5 ]

29 голосов
/ 01 февраля 2011

Я хочу написать шаблон, который соответствует всем узлам, кроме ServiceNode, т.е. от NodeA до NodeX.

Если под "узлом" вы подразумеваете элемент, тогда используйте :

<xsl:template match="*[not(self::ServiceNode)]">

Если под "узлом" вы подразумеваете любой узел (типа элемента, текста, комментария, инструкции обработки): используйте

<xsl:template match="node()[not(self::ServiceNode)]">

Если вы хотите, чтобы сопоставлялись только дочерние элементы Document, используйте:

<xsl:template match="Document/node()[not(self::ServiceNode)]">

Если вы хотите, чтобы сопоставлялись только дочерние элементы верхнего элемента:

<xsl:template match="/*/node()[not(self::ServiceNode)]">
4 голосов
/ 01 февраля 2011

Вам лучше использовать это выражение:

*[not(self::ServiceNode)]

Как включено в XSLT:

<xsl:stylesheet
    version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="text"/>

    <xsl:template match="/*">
        <xsl:apply-templates select="*[not(self::ServiceNode)]"/>
    </xsl:template>

    <xsl:template match="*">
        <xsl:value-of select="."/>
        <xsl:text>&#xA;</xsl:text>
    </xsl:template>

</xsl:stylesheet>

С этим примером XML:

<Document>
    <NodeA>1</NodeA>
    <NodeB>2</NodeB>
    <ServiceNode>3</ServiceNode>
    <NodeX>4</NodeX>
</Document>

Это будетдать правильный результат:

1
2
4
2 голосов
/ 01 февраля 2011
<xsl:template match="Document/*[name() != 'ServiceNode']">

(или local-name(), если вам приходится иметь дело с пространствами имен)

1 голос
/ 01 февраля 2011

Вы можете использовать два шаблона:

<xsl:template match="Document/*">
   ...do something...
</xsl:template>


<xsl:template match="Document/ServiceNode" />

Более поздний шаблон будет иметь приоритет, поэтому первый шаблон будет соответствовать всему, кроме ServiceNode.

0 голосов
/ 01 февраля 2011
/Document/*[not(name()='ServiceNode')]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...