Поддерживает ли XSLT нотацию Кларка? - PullRequest
2 голосов
/ 15 марта 2019

Недавно я узнал, что нотация Кларка в XML. Если 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-дереве.

Теперь я обычно пишу XSL для XML с помощью браузера: просто укажите XSL-лист вверху в своем XML-файле, дважды щелкните его, и браузер покажет, что из него сделал XSL. Так можно ли использовать нотацию Кларка в XSL / XSLT? Насколько я мог узнать, ответ - нет. Некоторые Googling привели меня к библиотекам для PHP и Perl, которые поддерживают его, но, очевидно, XSLT нет.

Я что-то пропустил? Если бы я этого не сделал, что могло быть причиной (-ами), что XSLT не поддерживает это?

Ответы [ 2 ]

3 голосов
/ 15 марта 2019

Обозначения в вашем примере

'.//{http://purl.org/dc/elements/1.1/}title'

не поддерживается ни в одной версии XPath, но XPath 3.0 предлагает нечто очень похожее, а именно

'.//Q{http://purl.org/dc/elements/1.1/}title'

Причина, по которой не использовалась нотация Кларка без изменений, заключалась в том, что в то время было много конкурирующих предложений для выражений, начинающихся с "{", включая карты в JSONiq, блоки операторов на языке сценариев XQuery и краткие встроенные функции; также был риск путаницы с использованием "{" в шаблонах значений атрибутов XSLT.

3 голосов
/ 15 марта 2019

Ну, путь, подобный .// или, лучше сказать, начиная с .//, поддерживается в любой версии XSLT / XPath (https://www.w3.org/TR/xpath-10/#path-abbrev).

Для стандартизированной поддержки, основанной на нотации Кларка, вам нужно обратиться к XPath / XSLT 3 https://www.w3.org/TR/xpath-31/#doc-xpath31-URIQualifiedName, где это делается как Q{http://example.com}foo, чтобы выбрать элементы с локальным именем foo в пространстве имен http://example.com.

И, конечно, ни тот, ни другой синтаксис не используют префикс, он напрямую использует пространство имен вместо префикса. Используя префикс, например, pf:foo поддерживается в любой версии XSLT / XPath, в XSLT вам просто нужно убедиться, что таблица стилей связывает префикс, например, с. 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...