Вместо самого выбора, Вы могли отключить все опции за исключением в настоящее время выбираемой опции. Это дает появление выпадающей работы, но только опция, которую Вы хотите, передала в, допустимый выбор.
В дополнение к решениям, предложенным Филом и Томалаком, я обнаружил, что XPath 2.0 предоставляет несколько альтернатив:
@attribute=('true','1')
string(@attribute) cast as xs:boolean
И, наконец, XPath 2.0 обеспечивает обработку с учетом схемы, что означает, что если все согласовано, вы должны быть в состоянии написать:
data(@attribute)
Но процессоры, поддерживающие схемы, кажутся трудными. Наиболее популярным, по-видимому, является платный коммерческий вариант saxon , который стоит 300 фунтов стерлингов. Итак, сейчас я использую @attribute = ('true', '1')
.
Ваши варианты могут зависеть от того, какой процессор XPath вы используете. Например, материалы Microsoft позволяют вам определять функции JavaScript, которые вы можете использовать для реализации шаблона «логический (@attribute)». Я не знаю, могут ли другие движки иметь аналогичную поддержку.
В противном случае я подозреваю, что вы застряли в необходимости проверять как «истина», так и «1».
Надеюсь, у кого-нибудь есть лучший ответ.
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.
Я использую простой именованный шаблон, который выполняет подробную проверку и настраивает его по мере необходимости для работы с устаревшими системами (например, некоторые поля могут использовать "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>