如果要在标签中指定不相关的标签属性,则强制 XML 解析器引发解析错误

Force the XML parser to raise a parse error, if irrelevant tag attributes were to be specified in a tag

我有一个用于 JSF 转换器的基本标记处理程序,如下所示(为简洁起见,省略了几件事)。

<tag>
    <description>
        <![CDATA[
            Converts a string representation to 
            <code>java.math.BigDecimal</code> based on attribute values given.
        ]]>
    </description>
    <tag-name>convertBigDecimal</tag-name>
    <converter><converter-id>bigDecimalConverter</converter-id></converter>

    <attribute>
        <description>
            <![CDATA[
                <a href="https://en.wikipedia.org/wiki/ISO_4217">ISO 4217 currency code</a> such as INR, USD, GBP, NZD etc.
            ]]>
        </description>
        <name>currency</name>
        <type>java.lang.String</type>
    </attribute>

    <attribute>
        <description>
            <![CDATA[
                A boolean value or flag indicating whether to transform 
                this value to percentage or not. The default is false.
            ]]>
        </description>
        <name>percent</name>
        <type>java.lang.Boolean</type>
    </attribute>

    <attribute>
        <description>
            <![CDATA[
                A boolean value or flag indicating whether to use a 
                currency symbol (such as $) or not. The default is true.
            ]]>
        </description>
        <name>useCurrencySymbol</name>
        <type>java.lang.Boolean</type>
    </attribute>

    <!-- Other attributes. -->
</tag>

它有几个属性,目标是将字符串表示形式转换为其等效的 java.math.BigDecimal 值,并将 java.math.BigDecimal 转换为各种显示格式,如带或不带货币符号、百分比、数字的货币分组、小数位数等

当然,百分比和货币不能在给出的示例中一起使用。所以,以下是完全有效的。

<my:convertBigDecimal currency="#{currencyCode}" groupingUsed="true" locale="#{locale}"/>

然而,以下将是无效的,如果尝试,预计会引发解析错误。

<my:convertBigDecimal percent="true"
                      currency="#{currencyCode}"
                      useCurrencySymbol="false"
                      groupingUsed="true"
                      locale="#{locale}"/>

例如,如果要尝试 percent 属性以及与货币相关的任何其他属性,如 currencyuseCurrencySymbol,则假定 XML 解析器应该发出一个解析错误,阻止 XML 文档本身被解析。

是否有可能以某种方式强制解析器发出解析错误,如果不相关的属性被尝试与给定的标签一起指定,以便可以省略转换器中的几个条件测试并且用户或应用程序可以警告使用转换器的开发人员不要过早在标记中使用不相关的属性?

很遗憾,无法通过 .taglib.xml 文件中的 XML 配置。只有通过 <converter><handler-class>.

注册的真实标签处理程序 class 才有可能
<converter>
    <converter-id>bigDecimalConverter</converter-id>
    <handler-class>com.example.BigDecimalConverterHandler</handler-class>
</converter>

public class BigDecimalConverterHandler extends ConverterHandler {

    public BigDecimalConverterHandler(ConverterConfig config) {
        super(config);

        if (getAttribute("percent") != null && getAttribute("currency") != null) {
            throw new IllegalArgumentException("Hey there, it does not make sense to specify both 'percent' and 'currency' attributes.");
        }
    }

}