Преобразование URI пространства имен XSL - PullRequest
0 голосов
/ 11 марта 2019

Учитывая xml-документ, где в пространствах имен реализована схема управления версиями, какой xslt можно применить для преобразования всех uris, сопоставления документа с новой версией?

Я не знаю, какие пространства имендокумент будет использовать, или как ссылки будут организованы в документе.

например

<a:add
    xmlns:a="urn:_2018_1.a" 
    xmlns:b="urn:_2018_1.b" 
    xmlns:c="urn:_2018_1.c"
    ....
>
...

до

<a:add
    xmlns:a="urn:_2019_1.a" 
    xmlns:b="urn:_2019_1.b" 
    xmlns:c="urn:_2019_1.c"
    ....
>
...

1 Ответ

1 голос
/ 11 марта 2019

В XSLT 2 и 3 вы можете создавать узлы пространства имен, используя xsl:namespace, поэтому

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    exclude-result-prefixes="xs"
    version="3.0">

<xsl:param name="old-ns-year" select="'2018'"/>
<xsl:param name="new-ns-year" select="'2019'"/>

<xsl:mode on-no-match="shallow-copy"/>

<xsl:template match="*">
    <xsl:element name="{name()}" namespace="{replace(namespace-uri(), $old-ns-year, $new-ns-year)}">
        <xsl:apply-templates select="namespace::*, @*, node()"/>
    </xsl:element>
</xsl:template> 

<xsl:template match="namespace::*">
    <xsl:namespace name="{name()}" select="replace(., $old-ns-year, $new-ns-year)"/>
</xsl:template>

<xsl:template match="@*">
    <xsl:attribute name="{name()}" namespace="{replace(namespace-uri(), $old-ns-year, $new-ns-year)}" select="."/>
</xsl:template>

</xsl:stylesheet>

должно дать вам идею, на https://xsltfiddle.liberty -development.net / pPzifpe itпреобразует

<a:add
    xmlns:a="urn:_2018_1.a" 
    xmlns:b="urn:_2018_1.b" 
    xmlns:c="urn:_2018_1.c"
>
</a:add>

в

<a:add xmlns:a="urn:_2019_1.a" xmlns:b="urn:_2019_1.b" xmlns:c="urn:_2019_1.c">
</a:add>

с использованием Saxon 9.8.

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