Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何从xslt中删除xml输出中不需要的空XMLN_Xslt_Namespaces - Fatal编程技术网

如何从xslt中删除xml输出中不需要的空XMLN

如何从xslt中删除xml输出中不需要的空XMLN,xslt,namespaces,Xslt,Namespaces,我正在尝试构建一个Soap请求。所需输出为: <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>

我正在尝试构建一个Soap请求。所需输出为:

<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>
<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>

EN
无名氏
psw

这是我的测试xsl(语言、用户名和密码将在实际应用程序中传递):


然而,输出是:

<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>
<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>

EN
无名氏
psw

存在不需要的空名称空间,例如xmlns:soap=“”、xmlns:soap1=“”。你能给我指出正确的方向来消除这些不需要的瑕疵吗


谢谢。

我很惊讶您的XSLT处理程序接受XSLT,因为它不是有效的XML,但是为了使它有效并(我相信)解决您的问题,您应该在
元素上声明名称空间,而不是在
元素上声明名称空间:

<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">

我强烈建议将演示与逻辑分开。事实上,您可以进行独立于任何可能的表示的转换

下面是“填空”技术(请注意,它还解决了不需要的名称空间的问题):

源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>
<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>
<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" 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>
<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>
<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" 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>
<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>
<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>

“嗯”
“约翰·多伊”
“psw”
现在,您可以根据需要拥有任意多个不同的演示文稿布局,并且在不做任何更改的情况下(只要指定了所有必需的参数)进行相同的转换即可生成这些格式中的任何一种

例如,如果要以这种新格式生成结果:

<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>
<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>

“嗯”
“约翰·多伊”
“psw”
只需对以下XML文档应用相同的转换:

<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>
<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(作为转换的参数),可以实现进一步的通用化。

JLRishe,感谢您的帮助。我用Altova XMLSpy测试了它,它没有抱怨xslt。将所有namsespaces移动到您建议的位置就可以了!Thank.User2254613,我强烈建议使用一种设计模式,允许演示文稿与逻辑完全分离——也称为“填空”技术。我不是对此投反对票的人,但您的输出在值周围有撇号,如果参数值是从外部传入的,这将不起作用(提问者说他最终会这么做)。@JLRishe,正如我在回答的最后指出的,这只是一个演示。此技术的全面和通用应用将接受布局和参数作为外部XML文档URI。