| <!DOCTYPE html> | |
| <link rel="help" href="https://www.w3.org/TR/1999/REC-xpath-19991116/#function-lang"> | |
| <link rel="help" href="https://www.w3.org/TR/xpath-functions-31/#func-lang"> | |
| <body> | |
| <script src="/resources/testharness.js"></script> | |
| <script src="/resources/testharnessreport.js"></script> | |
| <script> | |
| // Set the context node to the first child of the root element, and evaluate | |
| // the specified XPath expression. The test passes if | |
| // - The first child element name is 'match' and XPath result is true, or | |
| // - The first child element name is not 'match' and XPath result is false. | |
| function testFirstChild(expression, xmlString) { | |
| let doc = (new DOMParser()).parseFromString(xmlString, 'text/xml'); | |
| test(() => { | |
| let element = doc.documentElement.firstChild; | |
| let result = doc.evaluate(expression, element, null, XPathResult.BOOLEAN_TYPE, null); | |
| assert_equals(result.resultType, XPathResult.BOOLEAN_TYPE); | |
| assert_equals(result.booleanValue, element.localName == 'match', element.outerHTML); | |
| }, `${expression}: ${doc.documentElement.outerHTML}`); | |
| } | |
| testFirstChild('lang("en")', '<root><match xml:lang="en"/></root>'); | |
| testFirstChild('lang("en")', '<root><match xml:lang="EN"/></root>'); | |
| testFirstChild('lang("en")', '<root><match xml:lang="en-us"/></root>'); | |
| testFirstChild('lang("en")', '<root><unmatch/></root>'); | |
| // XPath 1.0 says: | |
| // if the context node has no xml:lang attribute, by the value of the | |
| // xml:lang attribute on the nearest ancestor of the context node that has | |
| // an xml:lang attribute. | |
| testFirstChild('lang("ja")', '<root xml:lang="ja"><match/></root>'); | |
| // XPath 1.0 says: | |
| // if there is some suffix starting with - such that the attribute value is | |
| // equal to the argument ignoring that suffix of the attribute value | |
| testFirstChild('lang("ja")', '<root xml:lang="ja-jp"><unmatch xml:lang="ja_JP"/></root>'); | |
| // U+212A should match to ASCII 'k'. | |
| // XPath 1.0 says: | |
| // ... such that the attribute value is equal to the argument ignoring that suffix | |
| // of the attribute value and ignoring case. | |
| // XPath 3.1 says: | |
| // ... true if and only if, based on a caseless default match as specified in | |
| // section 3.13 of The Unicode Standard, | |
| testFirstChild('lang("ko")', '<root><match xml:lang="Ko"/></root>'); | |
| </script> | |
| </body> |