Определите, существует ли узел с текстом - PullRequest
1 голос
/ 20 января 2012

Я хочу определить, содержит ли узел строку abc, используя following-sibling.

До сих пор я перебираю каждый узел item и хочу определить, содержит ли это itemnode со строкой abc

Это то, что я пробовал до сих пор:

contains(node/following-sibling::node[text()], 'abc')

XML:

<doc>
<item>
<node>1abc2</node>
<node>4</node>
<node>x</node>
</item>
<item>
<node>1</node>
<node>2abcX</node>
<node>x</node>
</item>
</doc>

Ответы [ 2 ]

0 голосов
/ 20 января 2012

Если все, что вы пытаетесь сделать, это ", определите, содержит ли item node со строкой abc" , тогда вам не нужно following-sibling. Используйте это, чтобы выбрать все такие узлы:

node[contains(., 'abc')]

Это соответствует node в обоих item предоставленных элементах.

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

node[following-sibling::node[contains(., 'abc')]]

Это соответствует только первому node во втором item.

Любое из этих значений может быть преобразовано в логическое значение с помощью функции boolean . Например:

boolean(node[following-sibling::node[contains(., 'abc')]])

Возвращает значение true, если по крайней мере один узел выбран выражением (т.е. набор узлов не пуст).

0 голосов
/ 20 января 2012

Этот XSL создает один узел, только 1 «узел» имеет «узел», следующий за ним со строкой «abc».

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" > 

<xsl:template match="/">
<doc>
    <xsl:for-each select='/doc/item/node[following-sibling::node[contains(.,"abc")]]'>
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:for-each>
</doc>
</xsl:template>
</xsl:stylesheet>
...