Java で XML文書を XSDスキーマによる妥当性検証する必要があり
はまったことがあったのでメモ。

なんと!
XSDによるXML妥当性検証の時、うるう秒*1はエラーとなる

■XSDによる妥当性検証方法

XSDによるXMLの妥当性検証は通常こんな感じにやるかと。

/**
 * XML 妥当性検証のための Java API
 * http://www.ibm.com/developerworks/jp/xml/library/x-javaxmlvalidapi.html
 **/
SchemaFactory factory = SchemaFactory.newInstance("http://www.w3.org/2001/XMLSchema");
Schema schema = factory.newSchema();

■うるう秒を含んだ日付(60秒)はXSDを用いた妥当性検証ではエラーとなります

XML内部の日付型に 60秒が含まれていた場合、エラーとなります。
以下ページによると、これはバグではないそうです。
https://issues.apache.org/jira/browse/XERCESJ-1379

英語なのでグーグル先生に翻訳してもらうと。。。

1
2
3
4
<blockquote>
    <p>うるう秒は、委員会が任意に割り当てられます。"2008-12-31T23:59:60.000000Z"が 有効な日付になる際にはXerces -J 2.9.1は、それが可能性が高いかどうか、まだ知られていなかったにリリースされました。ソフトウェアは、うるう秒を持っている将来のどの日か分からないことができますし、それが原因私たちは(たとえ過去の日付に) DateTime値でそれらをサポートするためではない意識的な決定をしたこの不確実性である。さらに、 XMLスキーマ1.1 [1]仕様<a href="#f-7fa0922f" name="fn-7fa0922f" title="XSD は XMLスキーマ1.1らしい。http://www.w3.org/TR/xmlschema11-1/">*2</a>は、明示的にうるう秒禁止します。 XML SchemaのWGでの方向を考えると、それは私たちが今までこの決定を覆すということは極めてまれである。</p>

</blockquote>

うーん。てっきりうるう秒に対応してるもんだと思ってた。。。
なお JAXBを使用した場合の日付型*3は60秒が使えます