настройка targetNamespace в xsl - PullRequest
0 голосов
/ 21 марта 2019

Мне нужно создать документ перевода для отката наших новых тел сообщений. Мне удалось откатить пространство имен без проблем, но возникли проблемы при откате targetNamespace.

В коде Java для targetNamespace задано значение new_namespace: 1.1.0 Входящее XML-сообщение выглядит следующим образом.

<env xmlns="original_cap_namespace" targetNamespace="new_namespace:1.1.0"</env>

Я хочу, чтобы исходящее сообщение выглядело так (замените пространство имен cap на новое_имя пространства и удалите контроль версий в taretNamespace)

<env xmlns="new_namespace" targetNamespace="new_namespace" </env>

Вот что я попробовал. Это работает для замены оригинального пространства имен_cap новым пространством имен. Кажется, я не могу понять, как убрать управление версиями из targetNamespace или установить targetNamespace в new_namespace так же, как xmlns. Я хочу, чтобы xmlns и targetNamespace были установлены в new_namespace.

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns="new_namespace"
xmlns:cap="original_cap_namespace"
exclude-result-prefixes="cap">
<xsl:output method="xml" indent="no" standalone="yes"/>
<xsl:strip-space elements="*"/>

<xsl:template match="/*[local-name()='env']">
    <env xmlns="new_namespace">
        <xsl:apply-templates select="@* | node()"/>
    </env>
</xsl:template>

<xsl:template match="@*">
    <xsl:attribute name="{local-name()}">
        <xsl:value-of select="."/>
    </xsl:attribute>
</xsl:template>

<xsl:template match="*">
    <xsl:element name="{local-name()}">
         <xsl:apply-templates select="@* | node()"/>
    </xsl:element>
</xsl:template>

Большое спасибо.

Ответы [ 2 ]

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

Кажется, я не могу понять, как убрать управление версиями из targetNamespace или установить targetNamespace в new_namespace, как xmlns.

targetNamespace является атрибутом, а необъявление пространства имен, так что вы можете сделать:

<xsl:template match="@targetNamespace">
    <xsl:attribute name="targetNamespace">
        <xsl:value-of select="substring-before(../@targetNamespace, ':')"/>
    </xsl:attribute>
</xsl:template>

для удаления версии или:

<xsl:template match="@targetNamespace">
    <xsl:attribute name="targetNamespace">new_namespace</xsl:attribute>
</xsl:template>

для установки содержимого в известную строку.

0 голосов
/ 21 марта 2019

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

  • Вы используете /*[local-name()='env'] в качестве шаблона, но на самом деле вы хотите изменить пространство имен для элемента в другом определенном пространстве имен. Нечто похожее на cap:env.

  • Другая проблема возникает из правила для каждого атрибута @* с содержимым шаблона, который выводит атрибут только с локальной частью QName. Таким образом, вы потеряете любой атрибут в пространстве имен (даже @xml:id)

  • Наконец, та же проблема для атрибутов происходит с правилом для каждого элемента *: он поддерживает только локальную часть QName, что приводит к действию элемента в пространстве имен по умолчанию (new_namespace вашего буквального элемента результата env). Таким образом, вы также потеряете любой элемент из словаря, отличного от original_cap_namespace.

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