Изменить пространство имен в XSLT с неизвестным префиксом - PullRequest
0 голосов
/ 30 мая 2019

Я хотел бы изменить пространство имен в XML-файле с помощью XSLT, основываясь только на namespace-uri, не зная, какой префикс определил это пространство имен.Возможно ли это?

У меня есть какое-то решение, но они работают только с небольшими файлами, когда я знаю входные данные, и могу настроить файл xsl вроде как вручную.

Чего я хотел бы достичь:

INPUT XML:

    <?xml version="1.0" encoding="UTF-8"?>
    <re:rootElement xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:re="http://something.com/root"
xmlns:ns1="http://something.com/some/schema"
xmlns:cs2="http://something.com/another/schema"
xmlns:ns3="http://something.com/different/schema"
xmlns:xsd="http://www.w3.org/2001/XMLSchema" >
<xsd:import namespace="http://something.com/another/schema" schemaLocation="/schema/location"/>

(несколько узлов ниже)

XSLT, который принимает 2 параметра:

<xsl:param name="old_namespace" select="'http://something.com/another/schema'"/>
<xsl:param name="new_namespace" select="'http://something.com/another/schemaNEW'"/>

и вывод в формате xml:

    <re:rootElement xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:re="http://something.com/root"
xmlns:ns1="http://something.com/some/schema"
xmlns:cs2="http://something.com/another/schemaNEW"
xmlns:ns3="http://something.com/different/schema"
xmlns:xsd="http://www.w3.org/2001/XMLSchema" >
 <xsd:import namespace="http://something.com/another/schemaNEW" schemaLocation="/schema/location"/>
(multiple nodes below)

1 Ответ

1 голос
/ 31 мая 2019

Нетрудно изменить URI пространства имен, используемый в узлах пространства имен и в именах элементов и атрибутов. В таблице стилей с поддержкой схемы также возможно (но, возможно, сложнее) изменить URI пространства имен, используемый в значениях типа QName. Я подозреваю, что довольно сложно изменить отображаемые URI пространства имен:

  • непосредственно в таких атрибутах, как xsi: schemaLocation или xs: import (если вы не перечислите такие атрибуты)

  • в названиях ОБОЗНАЧЕНИЙ

  • в контенте с микросинтаксисом, например, Рассмотрим

<xsl:if test="namespace-uri() = 'http://old-namespace.com/'>

Если вам нужны только пространства имен, используемые в элементе и атрибутах, тогда вы можете использовать

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

<xsl:template match="@*[namespace-uri()='$old-namespace']">
  <xsl:attribute name="{name()}" namespace="{$new-namespace}" select="."/>
</xsl:template>

вместе с шаблоном идентификации (или в версии 3.0, <xsl:mode on-no-match="shallow-copy"/>), чтобы убедиться, что другие элементы и атрибуты копируются без изменений.

(Это XSLT 2.0, но его легко переписать в 1.0).

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