Как удалить и добавить пространство имен в один xsl-файл - PullRequest
0 голосов
/ 01 июня 2018

У меня есть два xsl-файла, подключенных к конвейеру в приемном местоположении BizTalk.Один удаляет пространство имен из полученного сообщения, а другой добавляет пространство имен к нему.Поскольку приложение BizTalk выполняется в кластере с двумя узлами, xsl-файлы не всегда выполняются на одном и том же узле.Это приводит к приостановке сообщения.Можно ли удалить и добавить пространство имен в одном xsl-файле?

Я совсем новичок в xslt, может кто-нибудь подсказать мне?

Вот первый xsl-код, удаляющий пространство имен:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:msxsl="urn:schemas-microsoft-com:xslt" 
 exclude-result-prefixes="msxsl"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <xsl:output method="xml" omit-xml-declaration="no" encoding="UTF-8" indent="yes"/>
    <xsl:template match="*">
        <xsl:element name="{local-name()}">
            <xsl:apply-templates select="@* | node()" />
        </xsl:element>
    </xsl:template>
    <xsl:template match="@*">
        <xsl:attribute name="{local-name()}">
            <xsl:value-of select="." />
        </xsl:attribute>
    </xsl:template>
    <xsl:template match="text() | comment() | processing-instruction()">
        <xsl:copy />
    </xsl:template>
</xsl:stylesheet>

Вот второе пространство имен добавления xsl-кода:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt" xmlns:var="http://schemas.microsoft.com/BizTalk/2003/var" exclude-result-prefixes="msxsl var" version="1.0"  xmlns:utFil="http://www.healthxml.org/Schemas/CEN/1613/2001/01/LaboratoryServiceRequest">
    <xsl:output method="xml" omit-xml-declaration="no" encoding="UTF-8" indent="yes" version="1.0"/>

<xsl:template match="*">
  <xsl:copy><xsl:apply-templates/></xsl:copy>
  </xsl:template>

<xsl:template match="*[namespace-uri()='']">
  <xsl:element name="{local-name()}" namespace="http://www.healthxml.org/Schemas/CEN/1613/2001/01/LaboratoryServiceRequest/kit">
    <xsl:apply-templates/>
  </xsl:element>
</xsl:template>
</xsl:stylesheet>

Ответы [ 2 ]

0 голосов
/ 04 июня 2018

Итак, вы действительно меняете пространство имен, и я боюсь, что вы сделали его немного сложнее, чем нужно.

Все, что вам нужноявляется схемой с новым файлом Target Namespace и Mapper, использующим Functoid Mass Copy .

. Для ясности я говорю, что вы не должны использовать пользовательский xlst каквам не нужно, это можно сделать на одной карте, указанной на порту.

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

0 голосов
/ 01 июня 2018

Вы не будете далеки от простого использования XSLT для добавления пространств имен, поскольку на самом деле это не добавление пространств имен к существующим элементам, а создание новых элементов с тем же локальным именем, но в вашем новом пространстве имен.Вам просто нужно изменить шаблон, чтобы сделать его для всех элементов, а не только для элементов без пространства имен

Попробуйте это XSLT

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:output method="xml" omit-xml-declaration="no" encoding="UTF-8" indent="yes" version="1.0"/>

    <xsl:template match="*">
      <xsl:element name="{local-name()}" namespace="http://www.healthxml.org/Schemas/CEN/1613/2001/01/LaboratoryServiceRequest/kit">
        <xsl:apply-templates select="@*|node()" />
      </xsl:element>
    </xsl:template>

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

    <xsl:template match="text() | comment() | processing-instruction()">
        <xsl:copy />
    </xsl:template>    
</xsl:stylesheet>

Обратите внимание, что у вас могут быть проблемы, если у вас есть два атрибута содно и то же локальное имя, но разные пространства имен, хотя такая ситуация может быть не такой распространенной.Например:

<test xmlns:a="a" a:attr="1" attr="1" />
...