2011-12-23 2 views
3

Мне нужно проверить, существует ли конкретное значение в списке узлов.XSLT: проверьте, найден ли узел в узле nodelist

На данный момент я использую for-each, и я думаю, что это неэффективно.

<xsl:for-each select="$ChildList"> 
    <i><xsl:value-of select="current()"></xsl:value-of> and <xsl:value-of select="$thisProduct"></xsl:value-of></i><br/> 
    <xsl:if test="string(current())=string($thisProduct)"> 
     <!--<xsl:variable name="flag" select="1"/> --> 
     <p><b>Found!</b> 
</p> 
    </xsl:if> 
</xsl:for-each> 

Я хотел бы получить его одним выстрелом. Как я могу?

ответ

3

Используется так, как вы его используете, current() - это то же самое, что и . (см. Раздел 12.4). Однако цель current (в широком смысле) состоит в том, чтобы иметь возможность получить контекстный узел всего выражения изнутри предиката (где . представляет контекст предиката).

Я предполагаю, что тонкость этого различия может вызвать некоторую путаницу.

Это выражение XPath будет выполнено только в том случае, если строковое значение контекстного узла всего выражения совпадает с $ thisProduct. Это, очевидно, не то, что вы хотите:

$ChildList[string(current())=string($thisProduct)] 

Это выражение будет успешным, если есть узел в $ChildList, который имеет то же значение строки, как $ Thisproduct.

$ChildList[string(.)=string($thisProduct)] 

т.е. он просматривает $ChildList для узла, где выражение string(.)=string($thisProduct) верно.

+0

Большое спасибо. Меня устраивает. – Kangkan

2

Применение:

$thisProduct = $ChildList 

В случае thisProduct определяется содержать некоторое атомарное значение (а не набор узлов или последовательность в XPath 2.0), и $ChildList представляет собой последовательность множества узлов (или в XPath 2.0), то вышеупомянутое выражение XPath оценивается как true(), когда есть узел (или элемент в XPath 2.0) в $ChildList, строковое значение которого соответствует строковому значению $thisProduct.

Вы можете использовать это краткое выражение в атрибуте любого XSLT условной инструкции (xsl:if или xsl:when) или в шаблоне соответствия (атрибут match) любого xsl:template инструкции test.

Смежные вопросы