首页 > 解决方案 > 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>

lxmlPython 中,您可以像这样解析它:

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 不支持它的原因可能是什么?

标签: xmlxslt

解决方案


好吧,任何 XSLT/XPath 版本 ( https://www.w3.org/TR/xpath-10/#path-abbrev ) 都支持类似的路径,.//或者让我们更好地说从开始。.//

对于基于 Clark 表示法的标准化支持,您需要转到 XPath/XSLT 3 https://www.w3.org/TR/xpath-31/#doc-xpath31-URIQualifiedNameQ{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>

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


推荐阅读