xml - XSLT 是否支持 Clark 表示法?
问题描述
最近,我了解了XML 中的Clark 表示法。如果 XML 看起来像这样:
<srw:searchRetrieveResponse
xmlns:srw="http://www.loc.gov/zing/srw/"
...
<srw:record>
...
<dc:title>The C programming language</dc:title>
...
</srw:record>
在lxml
Python 中,您可以像这样解析它:
record_title = r.find('.//{http://purl.org/dc/elements/1.1/}title')
建筑.//{namespace uri}tag name
对我来说是新的。我认为它对您不熟悉的数据集非常有用,因为您只需要知道名称空间 uri(位于 XML 标头中)、前缀和标记名称即可找到它。因此,您无需了解 XML 树的方式。
现在,我通常使用浏览器为 XML 编写 XSL:只需在示例 XML 文件的顶部指定 XSL 表,双击它,浏览器就会显示 XSL 是由它构成的。那么我可以在 XSL/XSLT 中使用 Clark 表示法吗?据我所知,答案是否定的。一些谷歌搜索让我找到了支持它的 PHP 和 Perl 库,但显然 XSLT 不支持。
我错过了什么?如果我没有,那么 XSLT 不支持它的原因可能是什么?
解决方案
好吧,任何 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
在命名空间中http://example.com
。
当然,该语法和您的语法都没有使用任何前缀,它直接使用命名空间而不是任何前缀。任何版本的 XSLT/XPath 都支持使用前缀 eg pf:foo
,在 XSLT 中,您只需确保样式表将前缀与 eg 绑定xmlns:pf="http://example.com"
到正确的名称空间,使用 XPath 取决于特定的 API 是否以及如何做到这一点。
这是一个基于您的输入的示例,以显示您在 XSLT 3 中的一些选项:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="#all"
version="3.0">
<xsl:output indent="yes"/>
<xsl:template match="/">
<four-ways-to-select>
<enhanced-qname>
<xsl:copy-of select="//Q{http://purl.org/dc/elements/1.1/}title"/>
</enhanced-qname>
<namespace-declaration>
<xsl:copy-of select="//dc:title" xmlns:dc="http://purl.org/dc/elements/1.1/"/>
</namespace-declaration>
<xpath-default-namespace>
<xsl:copy-of select="//title" xpath-default-namespace="http://purl.org/dc/elements/1.1/"/>
</xpath-default-namespace>
<namespace-wildcard>
<xsl:copy-of select="//*:title"/>
</namespace-wildcard>
</four-ways-to-select>
</xsl:template>
</xsl:stylesheet>
推荐阅读
- sql-server - Azure 上的 .NET Core 无法连接到 SQL Server 数据库
- html - CSS:如何使 div 背景宽度适合
- php - 根据用户定义的索引顺序对数组进行排序
- json - 如何将数据保存回原始 json 文件?
- node.js - 无法读取未定义 nodejs 的属性“forEach”
- set - 如何找到集合中的元素个数?CPLEX OPL
- r - 如何测量R中的家庭范围栅格图层和多边形之间的重叠
- typescript - 如何使用“路径元组”从嵌套属性中检索类型
- node.js - (Mongoose Model) 不是构造函数错误
- c# - 在 Unity3D 项目保存期间检测 [ExecuteAlways] MonoBehavior 是否正在运行