XSLT是否支持Clark表示法?

时间:2019-03-15 09:21:14

标签: xml xslt

最近,我了解了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不支持它的原因可能是什么?

2 个答案:

答案 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"

https://xsltfiddle.liberty-development.net/3NJ38Z2

答案 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属性值模板中使用“ {”还存在混淆的风险。