2013-04-07 2 views
1

Я пытаюсь создать запрос Soap. Желаемый результат:Как удалить нежелательные пустые xmlns в xml-выходе из xslt

<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" 
xmlns:soap1="http://acme.com/ws/soapheaders"> 
<soap:Header> 
    <soap1:locale>en</soap1:locale> 
    <soap1:authentication> 
     <soap1:username>john.doe</soap1:username> 
     <soap1:password>psw</soap1:password> 
    </soap1:authentication> 
</soap:Header> 

Вот мое тестирование XSL (lanuage, имя пользователя и пароль будут передаваться в реальном приложении):

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
<xsl:output method="xml" omit-xml-declaration="yes" indent="yes"/> 
<xsl:param name="language" select="'en'"/> 
<xsl:param name="username" select="'john.doe'"/> 
<xsl:param name="password" select="'psw'"/> 
<xsl:template match="/"> 
    <soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" 
     xmlns:soap1="http://acme.com/ws/soapheaders" > 
     <xsl:call-template name="soapHeader"/>    
     <xsl:call-template name="soapBody"/> 
    </soap:Envelope> 
</xsl:template> 
<xsl:template name="soapHeader"> 
    <soap:Header> 
     <soap1:locale><xsl:value-of select="$language" /></soap1:locale> 
     <soap1:authentication> 
      <soap1:username><xsl:value-of select="$username" /></soap1:username> 
      <soap1:password><xsl:value-of select="$password" /></soap1:password> 
     </soap1:authentication> 
    </soap:Header> 
</xsl:template> 
<xsl:template name="soapBody"> 
</xsl:template> 
</xsl:stylesheet> 

Однако выход:

<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:soap1="http://acme.com/ws/soapheaders"> 
<soap:Header xmlns:soap=""> 
    <soap1:locale xmlns:soap1="">en</soap1:locale> 
    <soap1:authentication xmlns:soap1=""> 
     <soap1:username>john.doe</soap1:username> 
     <soap1:password>psw</soap1:password> 
    </soap1:authentication> 
</soap:Header> 

Есть нежелательные пустые пространства имен, такие как xmlns: soap = "", xmlns: soap1 = "". Можете ли вы указать мне правильные направления, чтобы устранить эти нежелательные артефакты?

Спасибо.

+0

User2254613, я настоятельно рекомендую использовать шаблон дизайна, который позволяет полностью отделить презентацию от логики - а также метод «Заполнить бланки». –

ответ

0

Я удивлен, что ваш XSLT-процессор принимает этот XSLT, так как он недействителен XML, но чтобы сделать его действительным и, также, (я считаю) решить вашу проблему, вы должны объявить пространства имен в элементе <xsl:stylesheet>, а не на <soap:Envelope> элемент:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" 
       xmlns:soap="http://www.w3.org/2003/05/soap-envelope" 
       xmlns:soap1="http://acme.com/ws/soapheaders"> 
+0

JLRishe, Спасибо за помощь. Я тестировал его с Altova XMLSpy, который не жаловался на xslt. Перемещение всех namsespaces туда, где вы предложили, делает трюк! Благодарю. – user2254613

-1

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

Здесь приходит техника "Fill-в-заготовок" (обратите внимание, что это также решает проблему нежелательных пространства имен):

Источник XML документа:

<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" 
xmlns:soap1="http://acme.com/ws/soapheaders" xmlns:gen="my:gen"> 
    <soap:Header> 
     <soap1:locale><gen:language/></soap1:locale> 
     <soap1:authentication> 
      <soap1:username><gen:username/></soap1:username> 
      <soap1:password><gen:password/></soap1:password> 
     </soap1:authentication> 
    </soap:Header> 
</soap:Envelope> 

Presentation- независимое преобразование:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:gen="my:gen"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 
<xsl:strip-space elements="*"/> 
    <xsl:param name="language" select="'en'"/> 
    <xsl:param name="username" select="'john.doe'"/> 
    <xsl:param name="password" select="'psw'"/> 

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

<xsl:template match="gen:*"> 
    <xsl:value-of select= 
    "document('')/*/xsl:param[@name=local-name(current())]/@select"/> 
</xsl:template> 
</xsl:stylesheet> 

Res ии:

<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:soap1="http://acme.com/ws/soapheaders" xmlns:gen="my:gen"> 
    <soap:Header> 
     <soap1:locale>'en'</soap1:locale> 
     <soap1:authentication> 
     <soap1:username>'john.doe'</soap1:username> 
     <soap1:password>'psw'</soap1:password> 
     </soap1:authentication> 
    </soap:Header> 
</soap:Envelope> 

Вы можете иметь сейчас, как много различных макетов презентации по мере необходимости, и то же преобразование без каких-либо изменений (при условии, все необходимые параметры были указаны) производит любой из этих форматов.

Например, если вы хотите, чтобы произвести результат в новом формате:

<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:soap1="http://acme.com/ws/soapheaders"> 
    <soap:Header> 
     <soap1:personalized> 
     <soap1:locale> 
      <soap1:language>'en'</soap1:language> 
     </soap1:locale> 
     <soap1:authentication> 
      <soap1:username>'john.doe'</soap1:username> 
      <soap1:password>'psw'</soap1:password> 
     </soap1:authentication> 
     </soap1:personalized> 
    </soap:Header> 
</soap:Envelope> 

просто применить то же преобразование на следующий документ XML:

<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" 
xmlns:soap1="http://acme.com/ws/soapheaders" xmlns:gen="my:gen"> 
    <soap:Header> 
     <soap1:personalized> 
     <soap1:locale> 
      <soap1:language><gen:language/></soap1:language> 
    </soap1:locale> 
     <soap1:authentication> 
      <soap1:username><gen:username/></soap1:username> 
      <soap1:password><gen:password/></soap1:password> 
     </soap1:authentication> 
     </soap1:personalized> 
    </soap:Header> 
</soap:Envelope> 

Дальнейшее обобщение может быть достигнуто путем предоставления URL-адреса макета-документа и URL-адреса документа Parameters - в качестве параметров преобразования.

+0

Я не тот, кто это сделал, но ваш результат имеет апострофы вокруг значений, и это не сработает, если значения параметров будут переданы извне (что, по словам заявителя, он в конечном итоге сделает). – JLRishe

+0

@JLRishe, Как я указал на конец моего ответа, это просто демо. Полное и общее применение этого метода будет принимать как макет, так и параметры как внешние URI-документы XML. –

Смежные вопросы