2016-12-05 2 views
1

У меня есть этот XML-файл:XSLT преобразование содержимого SOAP сообщений

<?xml version="1.0" encoding="UTF-8"?><S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"> 
    <SOAP-ENV:Header/> 
    <S:Body> 
     <ns2:wordList xmlns:ns2="http://service/"> 
      <prefix1>b</prefix1> 
      <prefix2>a</prefix2> 
     </ns2:wordList> 
    </S:Body> 
</S:Envelope> 

Я хочу, чтобы преобразовать этот файл:

<?xml version="1.0" encoding="UTF-8"?><S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"> 
    <SOAP-ENV:Header/> 
    <S:Body> 
     <ns2:wordList xmlns:ns2="http://service/"> 
      <pre1>b</pre1> 
      <pre2>a</pre2> 
     </ns2:wordList> 
    </S:Body> 
</S:Envelope> 

Однако то, что я получаю:

<?xml version="1.0" encoding="UTF-8"?> 



      <pre1 xmlns:ns2="http://ws/">b</pre1> 
      <pre2 xmlns:ns2="http://ws/">a</pre2> 

Мое преобразование:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
       xmlns:ns2="http://ws/" 
       version="1.0"> 
    <xsl:output method="xml"/> 


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

    <xsl:template match="ns2:wordList"> 
     <ns2:wordList xmlns:ns2="http://ws/"> 
     <xsl:apply-templates/> 
     </ns2:wordList> 
    </xsl:template> 

    <xsl:template match="pre1|prefix1"> 
     <pre1> 
      <xsl:value-of select="."/> 
     </pre1> 
    </xsl:template> 

    <xsl:template match="pre2|prefix2"> 
     <pre2> 
      <xsl:value-of select="."/> 
     </pre2> 
    </xsl:template> 
</xsl:stylesheet> 

Почему я теряю почти всю информацию? Я бы подумал, что преобразование XSL просто скопирует все элементы, которые не заданы определенным шаблоном, но вместо этого все, кажется, теряется, кроме информации, содержащейся в шаблонах «pre».

+2

Ваше использование пространств имен XML является непоследовательным и запутанным. Какой смысл регистрировать одно и то же пространство имен с двумя разными префиксами ('S' и' SOAP-ENV')? Что означает 'http: // ws /'? Это ни в одном из ваших входных документов. Наконец, XSLT не просто копирует все элементы, которые не заданы определенным шаблоном. Это задание шаблона идентификации, которого у вас нет в XSLT. – Tomalak

+0

Это также можно рассматривать как дубликат таких вопросов, как: http://stackoverflow.com/questions/4970678/renaming-nodes-and-values-with-xslt – Meyer

ответ

1

Как указано в моем комментарии, вам нужно использовать шаблон идентификации, если вы хотите произвести идентичный вывод.

Это не XSLT, который магически копирует ваш входной документ - это этот шаблон.

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

В вашем случае вы не хотите копировать <prefix1> и <prefix2>, поэтому нам нужны два дополнительных шаблона, которые вносят изменения в эти элементы.

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

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

    <!-- custom templates below --> 
    <xsl:template match="prefix1"> 
    <pre1> 
     <xsl:apply-templates select="@* | node()" /> 
    </pre1> 
    </xsl:template> 

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

производит

<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/" 
     xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"> 
    <SOAP-ENV:Header/> 
    <S:Body> 
    <ns2:wordList xmlns:ns2="http://service/"> 
     <pre1>b</pre1> 
     <pre2>a</pre2> 
    </ns2:wordList> 
    </S:Body> 
</S:Envelope> 

Если вы можете сделать что-нибудь об этом, сделать так, чтобы ваш входной документ использует префиксы пространства имен последовательно. Например, например:

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> 
    <soap:Header/> 
    <soap:Body> 
     <foo:wordList xmlns:foo="http://service/"> 
      <prefix1>b</prefix1> 
      <prefix2>a</prefix2> 
     </foo:wordList> 
    </soap:Body> 
</soap:Envelope> 
Смежные вопросы