Прервать цикл XSLT for-each, когда будет найдено первое совпадение - PullRequest
0 голосов
/ 08 июня 2011

У меня проблемы с отображением первого подходящего значения, например

<test>
    <p>30</p>
    <p>30{1{{23{45<p>
    <p>23{34</p>
    <p>30{1{98</p>
</test>
<test2>
    <p1>text</p1>
</test2>

Так что я хочу пройтись по <test></test> и найти значение узла <p>, длина строки которого больше 2и это содержит 30. Я хочу только первое значение.поэтому мне надоел следующий код

<xsl:variable name="var_test">
    <xsl:for-each select="*/*/test()>
        <xsl:if string-length(p/text())>2 and contains(p/text(),'30'))
    <xsl:value-of select="xpath">
</xsl:variable>

проблема в том, что var_test всегда нулевой.

если я пытаюсь напрямую без какой-либо переменной

<xsl:for-each select="*/*/test()>
    <xsl:if string-length(p/text())>2 and contains(p/text(),'30'))
<xsl:value-of select="xpath">

Яполучая следующий вывод

<p>30{1{23{4530{1{98</p>

, но желаемый результат равен

<p>0{1{23{45</p>

, так как я могу добиться этого?

1 Ответ

3 голосов
/ 08 июня 2011

Вместо каждого используйте

<xsl:copy-of select="(*/*/test/p[string-length() > 2 and
                                 contains(.,'30'))] )[1]" />

[1] выбирает только первое совпадение <p>. ( Обновлено : я изменил XPath выше в ответ на комментарий @ markusk.)

Выше будет выведен этот элемент <p>, а также его текстовое содержимое, как показано в «желаемом выводе». Если вам действительно нужно только значение <p>, то есть его текстовое содержимое, используйте <xsl:value-of> вместо <xsl:copy-of>.

Добавление:

Идея выхода из цикла неприменима к XSLT, потому что это не процедурный язык. В цикле <xsl:for-each> «первое» создание (говоря в терминах порядка документов или отсортированного порядка) цикла не обязательно оценивается во время хронологически перед «последним» созданием. Они могут оцениваться в любом порядке или параллельно, потому что они не зависят друг от друга. Поэтому попытка «вырваться из цикла», которая предназначена для того, чтобы «последующие» экземпляры цикла не оценивались, не может сработать: в противном случае результат более поздних экземпляров будет зависеть от более ранних экземпляров и параллельной оценки будет исключен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...