最近,我了解了Clark notation在XML中的含义。如果XML看起来像这样:
<srw:searchRetrieveResponse
xmlns:srw="http://www.loc.gov/zing/srw/"
...
<srw:record>
...
<dc:title>The C programming language</dc:title>
...
</srw:record>
使用Python中的lxml
,您可以像这样解析它:
record_title = r.find('.//{http://purl.org/dc/elements/1.1/}title')
.//{namespace uri}tag name
结构对我来说是新的。我认为这对于您不熟悉的数据集非常有用,因为您只需要知道名称空间uri(位于XML标头中),前缀和标记名即可找到它。因此,无需了解围绕XML树的方法。
现在,我通常使用浏览器编写XSL for XML:只需在示例XML文件的顶部指定XSL工作表,双击它,浏览器就会显示XSL的内容。那么我可以在XSL / XSLT中使用Clark表示法吗?据我所知,答案是否定的。一些谷歌搜索使我找到了支持它的PHP和Perl库,但是显然,XSLT不支持。
我错过了什么吗?如果我不这样做,那么XSLT不支持它的原因可能是什么?
答案 0 :(得分:3)
好吧,任何XSLT / XPath版本(https://www.w3.org/TR/xpath-10/#path-abbrev)都支持.//
之类的路径,或者最好说以.//
开头。
要获得基于Clark表示法的标准化支持,您需要转到XPath / XSLT 3 https://www.w3.org/TR/xpath-31/#doc-xpath31-URIQualifiedName,在此处以Q{http://example.com}foo
的形式在命名空间{中选择具有本地名称foo
的元素{1}}。
当然,该语法和您的语法都不使用任何前缀,而是直接使用名称空间而不是任何前缀。使用前缀例如在任何版本的XSLT / XPath中都支持http://example.com
,在XSLT中,您只需要确保样式表将前缀与即可绑定即可。 pf:foo
到正确的名称空间,使用XPath取决于特定的API是否以及如何执行。
这里是一个基于您的输入的示例,以显示XSLT 3中的一些选项:
xmlns:pf="http://example.com"
答案 1 :(得分:3)
示例中的符号
'.//{http://purl.org/dc/elements/1.1/}title'
任何版本的XPath都不支持,但是XPath 3.0提供了非常相似的功能,即
'.//Q{http://purl.org/dc/elements/1.1/}title'
之所以不使用Clark表示法,是因为当时有许多竞争提案,这些提案以“ {”开头的表达式,包括JSONiq中的映射,XQuery脚本语言中的语句块以及简短的内联函数;在XSLT属性值模板中使用“ {”还存在混淆的风险。