Как выбрать узлы с булевым знаком в XPath?

Вместо самого выбора, Вы могли отключить все опции за исключением в настоящее время выбираемой опции. Это дает появление выпадающей работы, но только опция, которую Вы хотите, передала в, допустимый выбор.

5
задан Cheran Shunmugavel 24 May 2012 в 08:02
поделиться

4 ответа

В дополнение к решениям, предложенным Филом и Томалаком, я обнаружил, что XPath 2.0 предоставляет несколько альтернатив:

@attribute=('true','1')
string(@attribute) cast as xs:boolean

И, наконец, XPath 2.0 обеспечивает обработку с учетом схемы, что означает, что если все согласовано, вы должны быть в состоянии написать:

data(@attribute)

Но процессоры, поддерживающие схемы, кажутся трудными. Наиболее популярным, по-видимому, является платный коммерческий вариант saxon , который стоит 300 фунтов стерлингов. Итак, сейчас я использую @attribute = ('true', '1') .

6
ответ дан 13 December 2019 в 05:40
поделиться

Ваши варианты могут зависеть от того, какой процессор XPath вы используете. Например, материалы Microsoft позволяют вам определять функции JavaScript, которые вы можете использовать для реализации шаблона «логический (@attribute)». Я не знаю, могут ли другие движки иметь аналогичную поддержку.

В противном случае я подозреваю, что вы застряли в необходимости проверять как «истина», так и «1».

Надеюсь, у кого-нибудь есть лучший ответ.

1
ответ дан 13 December 2019 в 05:40
поделиться

Using XPath alone the expression you propose is as close as it gets. There are different ways of doing the same check, but all of them would lead to a longer and more complicated expression and conceal the intent more.

I don't think there is a schema-aware processor, XML schema is not connected to XSLT and it would not make much sense to build support for it into a processor, IMHO. The language is defined, and extensions are the accepted standard way of adding functionality.

If the library you use supports the EXSL extension functions, you could write a semi-portable mechanism to abstract the boolean check into a function, or you could use vendor-specific extensions like MSXSL to the same.

I think it is best to stay with the expression you have. It is not convoluted, only a bit verbose.

1
ответ дан 13 December 2019 в 05:40
поделиться

Я использую простой именованный шаблон, который выполняет подробную проверку и настраивает его по мере необходимости для работы с устаревшими системами (например, некоторые поля могут использовать "Y" / "N", некоторые "True" / " False », остальные 1/0) и выгружают значение в переменную. Это не самый элегантный подход, но если вы используете XPath 1.0, не имеете поддержки EXSLT и не можете (или не хотите) использовать внешние вызовы скриптов, он работает стабильно и может быть изменен по мере необходимости.

<xsl:template name="CleanupBool">
    <xsl:param name="val" />
    <xsl:choose>
        <xsl:when test="$val='1'">1</xsl:when>
        <xsl:when test="$val='true'">1</xsl:when>
        <xsl:when test="$val='True'">1</xsl:when>
        <xsl:when test="$val='TRUE'">1</xsl:when>
        <xsl:when test="$val='T'">1</xsl:when>
        <xsl:when test="$val='Y'">1</xsl:when>
        <xsl:otherwise>0</xsl:otherwise>
    </xsl:choose>
</xsl:template>

Использование:

<xsl:variable name="enabled">
    <xsl:call-template name="CleanupBool">
        <xsl:with-param name="val" select="IS_ENABLED"/>
    </xsl:call-template>
</xsl:variable>
1
ответ дан 13 December 2019 в 05:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: