XSLT содержит () и пустой тег - PullRequest
1 голос
/ 10 марта 2011

У меня проблема с XSLT 1.0, содержит функцию () и пустые теги.

У меня есть эта таблица стилей xslt:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" indent="yes"/>
    <xsl:template match="/">
        <xsl:for-each select="test/tester">
            <test>
                <xsl:value-of select="."/>
                <xsl:text>: </xsl:text>
                <xsl:value-of select="contains('11,22,33', .)"/>
            </test>
        </xsl:for-each>
    </xsl:template>
</xsl:stylesheet>

И вход такой:

<?xml version="1.0" encoding="UTF-8"?>
<test>
    <tester>11</tester>
    <tester>22</tester>
    <tester>33</tester>
    <tester>xx</tester>
    <tester/>
</test>

Результат таков:

<?xml version="1.0" encoding="UTF-8"?>
<test>11: true</test>
<test>22: true</test>
<test>33: true</test>
<test>xx: false</test>
<test>: true</test>

Проблема здесь в том, что я ожидаю, что функция contains() вернет false, если тег <tester> пуст. Однако это возвращает true для последней строки. Как можно избежать этого, кроме проверки сначала значения тега на пустоту и установки переменной для некоторого значения, которое, как я знаю, отсутствует в списке значений?

Спасибо!

Ответы [ 2 ]

3 голосов
/ 10 марта 2011

Это стандарт для W3C Spec поведения .

Чтобы избежать этого, используйте :

contains(',11,22,33,', concat(',', ., ','))
2 голосов
/ 10 марта 2011

Спецификация XPath 1.0 довольно неопределенная по этому вопросу, но спецификация функций XQuery 1.0 и XPath 2.0 явно декларирует :

If the value of $arg2 is the zero-length string, then the function returns true.

Я не думаю, что это что-то новое, просто разъяснение старой функциональности.

...