Заменить строку, определенную винт в пространстве имен - PullRequest
2 голосов
/ 08 сентября 2011

Я очень плохо знаком с XSL и мне нужна помощь с моим XSL, у меня есть запрос, где мне нужно заменить строку, определенную в SPR пространства имен, на другую строку, но по какой-то причине мой XSL не работает, может кто-нибудь помочьмне, где это пошло не так.

XML:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://xyz.com/xsd">
   <soapenv:Header>
      <xsd:myHeader>
         <!--Optional:-->
         <APP_ID>APP_ID</APP_ID>
         </xsd:myHeader>
   </soapenv:Header>
   <soapenv:Body>
      <tns:SPR xmlns:tns="http://xyz.com/xsd">
         <Info>
            <System>
               <id>id</id>
               <sourceSystemName>sourceSystemName</sourceSystemName>
            </System>
            <Type>transmissionType</Type>
            <Id>encounterId</Id>
            </Info>
              </tns:SPR>
   </soapenv:Body>
</soapenv:Envelope>

XSL:

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
   <xsl:template match="/">
      <xsl:for-each select="/Header/Body/SubmitPreClaimRequest/*[namespace-uri(.)='']">     
      <xsl:call-template name="string-replace-all">
         <xsl:with-param name="text" select="/Header/Body/SPR" />
         <xsl:with-param name="replace" select="SPR" />
         <xsl:with-param name="by" select="ONE" />
      </xsl:call-template>
      </xsl:for-each>
      <xsl:apply-templates />


   </xsl:template>
<xsl:template name="string-replace-all">
   <xsl:param name="text" />

   <xsl:param name="replace" />

   <xsl:param name="by" />

   <xsl:choose>
      <xsl:when test="contains($text,$replace)">
         <xsl:value-of select="substring-before($text,$replace)" />

         <xsl:value-of select="$by" />

         <xsl:call-template name="string-replace-all">
            <xsl:with-param name="text" select="substring-after($text,$replace)" />

            <xsl:with-param name="replace" select="$replace" />

            <xsl:with-param name="by" select="$by" />
         </xsl:call-template>
      </xsl:when>

      <xsl:otherwise>
         <xsl:value-of select="$text" />
      </xsl:otherwise>
   </xsl:choose>
</xsl:template>
</xsl:stylesheet>

Result with my XSL:

<?xml version="1.0" encoding="UTF-16"?>APP_IDidsourceSystemNametransmissionTypeencounterId

EXPECTED Result:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://xyz.com/xsd">
   <soapenv:Header>
      <xsd:myHeader>
         <!--Optional:-->
         <APP_ID>APP_ID</APP_ID>
         </xsd:myHeader>
   </soapenv:Header>
   <soapenv:Body>
      **<tns:ONE xmlns:tns="http://xyz.com/xsd">**
         <Info>
            <System>
               <id>id</id>
               <sourceSystemName>sourceSystemName</sourceSystemName>
            </System>
            <Type>transmissionType</Type>
            <Id>encounterId</Id>
            </Info>
              **</tns:ONE>**
   </soapenv:Body>
</soapenv:Envelop

Ответы [ 2 ]

0 голосов
/ 09 сентября 2011

Это короткое и простое полное преобразование (переопределение правила идентификации):

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:soapenv=
 "http://schemas.xmlsoap.org/soap/envelope/"
 xmlns:tns="http://xyz.com/xsd">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match="node()|@*">
     <xsl:copy>
       <xsl:apply-templates select="node()|@*"/>
     </xsl:copy>
 </xsl:template>

 <xsl:template match="tns:SPR">
  <tns:ONE>
   <xsl:apply-templates/>
  </tns:ONE>
 </xsl:template>
</xsl:stylesheet>

при применении к предоставленному документу XML :

<soapenv:Envelope xmlns:soapenv=
 "http://schemas.xmlsoap.org/soap/envelope/"
 xmlns:xsd="http://xyz.com/xsd">
    <soapenv:Header>
        <xsd:myHeader>
            <!--Optional:-->
            <APP_ID>APP_ID</APP_ID>
        </xsd:myHeader>
    </soapenv:Header>
    <soapenv:Body>
        <tns:SPR xmlns:tns="http://xyz.com/xsd">
            <Info>
                <System>
                    <id>id</id>
                    <sourceSystemName>sourceSystemName</sourceSystemName>
                </System>
                <Type>transmissionType</Type>
                <Id>encounterId</Id>
            </Info>
        </tns:SPR>
    </soapenv:Body>
</soapenv:Envelope>

дает желаемый, правильный результат :

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://xyz.com/xsd">
   <soapenv:Header>
      <xsd:myHeader><!--Optional:-->
         <APP_ID>APP_ID</APP_ID>
      </xsd:myHeader>
   </soapenv:Header>
   <soapenv:Body>
      <tns:ONE xmlns:tns="http://xyz.com/xsd">
         <Info>
            <System>
               <id>id</id>
               <sourceSystemName>sourceSystemName</sourceSystemName>
            </System>
            <Type>transmissionType</Type>
            <Id>encounterId</Id>
         </Info>
      </tns:ONE>
   </soapenv:Body>
</soapenv:Envelope>

Объяснение

  1. Правило идентификации / template копирует каждый узел "как есть" .

  2. Существует только один шаблон, который переопределяет правило идентификации - соответствует любому элементу tns:SPR.

  3. В этом переопределяющем шаблоне выводится новый элемент-литерал с именем tns:ONE - внутри его тела обрабатываются все его дочерние узлы (по шаблону идентификации, что приводит к копированию их "как есть").

Помните : Использование и переопределение правила идентификации является наиболее фундаментальным и мощным шаблоном проектирования XSLT - лучше всего подходит для любой задачи, требующей копирования большинства узлов «как есть» и только для другой обработки некоторые конкретные узлы - переименовать / удалить / вставить, ... и т. д.

0 голосов
/ 09 сентября 2011

Примечание:

  • Вы не объявили никакого пространства имен в xsl и не использовали необходимые префиксы. Смотрите этот вопрос .
  • Элемент HEADER не является внешним элементом вашего входного XML. Смотрите этот вопрос .
  • Элемент SubmitPreClaimRequest отсутствует во входном XML (или, по крайней мере, в показанном вами примере)
  • Никто не использует «string-replace» для замены имени элемента таким способом. Смотрите этот вопрос .
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...