当前位置: 首页 > 知识库问答 >
问题:

命名空间的XSLT转换

刁远
2023-03-14
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
     <soapenv:Body>
      <tns:send xmlns:tns="http://www.test.com/Service/v3">
         <NS2:Message release="006" version="010" xmlns:NS2="http://www.ncpdp.org/schema/SCRIPT">

            <NS2:Body>
               <NS2:New>
                  <NS2:Pharmacy>
                     <NS2:Identification>
                        <NS2:ID>
                           <NS2:IDValue>01017</NS2:IDValue>
                           <NS2:IDQualifier>94</NS2:IDQualifier>
                           <NS2:IDRegion>SCA</NS2:IDRegion>
                            <NS2:IDState>CA</NS2:IDState>
                        </NS2:ID>
                             </NS2:Identification>
                             </NS2:Pharmacy>
                    </NS2:New>
            </NS2:Body>
         </NS2:Message>
      </tns:send>
   </soapenv:Body>
</soapenv:Envelope>

我有这个xml是架构版本3.0http://www.test.com/Service/v3。我需要将其降级到版本1http://www.test.com/Service/v1.为此,我使用XSL来转换它。

        <?xml version="1.0" encoding="ISO-8859-1"?>
        <xsl:stylesheet version="2.0" 
            xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
            xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
            xmlns:booga="http://schemas.xmlsoap.org/wsdl/"
            xmlns:tns="http://www.test.com/Service/v3"
            xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
            xmlns:src="http://www.ncpdp.org/schema/SCRIPT"
        > 


        <xsl:output method="xml" version="1.0" encoding="UTF-8" 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:*">
            <!-- Output a new element in the new namespace -->
            <xsl:element name="tns:{local-name()}" namespace="http://www.test.com/Service/v1">
              <!-- Copy all child attributes and nodes 
             <xsl:apply-templates select="node()|@*"/> -->
            <xsl:apply-templates  />
            </xsl:element>
          </xsl:template>

        </xsl:stylesheet>

但我得到这样的结果

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
     <soapenv:Body>
      <tns:send xmlns:tns="http://www.test.com/Service/v3">
         <NS2:Message release="006" version="010" xmlns:NS2="http://www.ncpdp.org/schema/SCRIPT" xmlns:tns="http://www.test.com/Service/v3">

            <NS2:Body>
               <NS2:New>
                  <NS2:Pharmacy>
                     <NS2:Identification>
                        <NS2:ID>
                           <NS2:IDValue>01017</NS2:IDValue>
                           <NS2:IDQualifier>94</NS2:IDQualifier>
                           <NS2:IDRegion>SCA</NS2:IDRegion>
                            <NS2:IDState>CA</NS2:IDState>
                        </NS2:ID>
                         </NS2:Identification>
                         </NS2:Pharmacy>
                    </NS2:New>
            </NS2:Body>
         </NS2:Message>
      </tns:send>
   </soapenv:Body>
</soapenv:Envelope>

在我的输出XML中,我得到了这个

<NS2:Message release="006" version="010" xmlns:NS2="http://www.ncpdp.org/schema/SCRIPT"   xmlns:tns="http://eps.pdxinc.com/webservice/Rxservice/v3"> 

为什么将其添加到NS2:消息中?

xmlns:tns="http://eps.pdxinc.com/webservice/Rxservice/v3 

它不在输入xml中。

我遗漏了一些东西。如果有人能指出这个问题,我将不胜感激。

我希望在输出中创建以下内容:

<?xml version="1.0"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
    <soapenv:Body>
        <tns:send xmlns:tns="http://www.test.com/Service/v1">
            <NS2:Message release="006" version="010" xmlns:NS2="http://www.ncpdp.org/schema/SCRIPT" >

                <NS2:Body>
                    <NS2:New>
                        <NS2:Pharmacy>
                            <NS2:Identification>
                                <NS2:ID>
                                    <NS2:IDValue>01017</NS2:IDValue>
                                    <NS2:IDQualifier>94</NS2:IDQualifier>
                                    <NS2:IDRegion>SCA</NS2:IDRegion>
                                    <NS2:IDState>CA</NS2:IDState>
                                </NS2:ID>
                            </NS2:Identification>
                        </NS2:Pharmacy>
                    </NS2:New>
                </NS2:Body>
            </NS2:Message>
        </tns:send>
    </soapenv:Body>
</soapenv:Envelope>

我正在应用的XSL文档添加了一个额外的名称空间http://www.test.com/Service/v3在NS2:消息中。

最初的标签是:

<NS2:Message release="006" version="010" xmlns:NS2="http://www.ncpdp.org/schema/SCRIPT">

应用XSL后,它变为:

<NS2:Message release="006" version="010" xmlns:NS2="http://www.ncpdp.org/schema/SCRIPT" xmlns:tns="http://www.test.com/Service/v3>

我不知道这个命名空间添加到哪里。

我只想转换http://www.test.com/Service/v3toxmlns:tns=”http://www.test.com/Service/v3在tns中:发送标签。

共有1个答案

费锋
2023-03-14

试试这个。。。

XML输入

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
    <soapenv:Body>
        <tns:send xmlns:tns="http://www.test.com/Service/v3">
            <NS2:Message release="006" version="010" xmlns:NS2="http://www.ncpdp.org/schema/SCRIPT">

                <NS2:Body>
                    <NS2:New>
                        <NS2:Pharmacy>
                            <NS2:Identification>
                                <NS2:ID>
                                    <NS2:IDValue>01017</NS2:IDValue>
                                    <NS2:IDQualifier>94</NS2:IDQualifier>
                                    <NS2:IDRegion>SCA</NS2:IDRegion>
                                    <NS2:IDState>CA</NS2:IDState>
                                </NS2:ID>
                            </NS2:Identification>
                        </NS2:Pharmacy>
                    </NS2:New>
                </NS2:Body>
            </NS2:Message>
        </tns:send>
    </soapenv:Body>
</soapenv:Envelope>

XSLT 1.0(如果您更改版本,则为2.0)

(编辑:将“tns”前缀更改为“djh”,以说明前缀如何无关紧要。)

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:djh="http://www.test.com/Service/v3"
    xmlns:NS2="http://www.ncpdp.org/schema/SCRIPT"
    xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
    <xsl:output indent="yes"/>
    <xsl:strip-space elements="*"/>

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

    <xsl:template match="djh:*">
        <xsl:element name="{name()}" namespace="http://www.test.com/Service/v1">
            <xsl:apply-templates select="@*|node()"/>
        </xsl:element>  
    </xsl:template>

    <xsl:template match="*">
        <xsl:element name="{name()}">
            <xsl:apply-templates select="@*|node()"/>
        </xsl:element>      
    </xsl:template>

</xsl:stylesheet>

XML输出

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
   <soapenv:Body>
      <tns:send xmlns:tns="http://www.test.com/Service/v1">
         <NS2:Message xmlns:NS2="http://www.ncpdp.org/schema/SCRIPT" release="006" version="010">
            <NS2:Body>
               <NS2:New>
                  <NS2:Pharmacy>
                     <NS2:Identification>
                        <NS2:ID>
                           <NS2:IDValue>01017</NS2:IDValue>
                           <NS2:IDQualifier>94</NS2:IDQualifier>
                           <NS2:IDRegion>SCA</NS2:IDRegion>
                           <NS2:IDState>CA</NS2:IDState>
                        </NS2:ID>
                     </NS2:Identification>
                  </NS2:Pharmacy>
               </NS2:New>
            </NS2:Body>
         </NS2:Message>
      </tns:send>
   </soapenv:Body>
</soapenv:Envelope>
 类似资料:
  • 我需要一个简单的xslt,它接受输入并提供如下所述的输出。我已经编写了xslt,但名称空间被忽略了。你能帮我一下吗。 输入消息: 预期输出消息: 实际输出消息: XSLT:

  • 我试图用XSLT处理器在PHP中转换xml文档,但我无法选择任何内容。。。我认为这是一个名称空间问题。如果我从一个干净的<代码> inputxml: Xsl-file: 我无法更改输入文件,因为它是由其他程序生成的。 安德烈

  • 我是XSLT的新手,命名空间有问题。这是我必须转换的XML: 我正在使用以下XSLT: 结果是: 我试图删除结果输入顺序中的名称空间,但它不适合我。有人能帮我学习XSLT吗?谢谢

  • 我试图将Excel xml文件的一部分呈现为超文本标记语言,以便在翻译(外语翻译)计算机辅助翻译工具中的部分内容时改进预览。 我有以下xml: 我试图从每行中提取第二个数据元素并显示它,但我根本无法显示它。我认为这与名称空间有关,我肯定遗漏了什么,但看不出是什么。这就是我正在使用的: 有人能帮我吗? 我应该补充一点,我正在使用Treebeard来测试这个,它用这些错误验证xml(我无法控制)...

  • 如果我删除所有命名空间和前缀,我的XSLT转换将完美运行。 我曾尝试过几次引入名称空间,但最终总是出现某种错误或没有输出,因此我在这里寻求一些帮助和理解。 我的预期输出,缩减为命名空间和前缀,是: 再次缩减的XML输入是: 为了实现正确的命名空间转换,我需要向XSLT头中添加什么?

  • 我正在尝试创建一个XSLT文件,我可以让它工作,而无需在任何一个文件中包含名称空间,但只要我在其中包含名称空间,它就会停止工作。以下是我正在使用的示例。 我的XML文件 我的转换文件。 我的结果 如果我将上述内容更改为此,则不会。我的新XML文件 我的新转换文件。 我现在在转换后的文件中没有数据了?如果这个问题是基本的,请原谅,我没有XSLT的经验,目前我正努力解决这个问题。