1

XSLを適用してスキーマバージョンが異なる別のXMLに変換する必要があるXMLがあります。スキーマの2つのバージョンはV1とV2です。私のスキーマバージョンV1ではIDに許可される最大インスタンスは2でしたが、スキーマのバージョン2では3に変更されました。バージョン2のXMLをバージョン1のXMLにダウングレードしているので、2つだけにしておきたい最終的なXMLのIDタイプのインスタンス。XSLTでそれを行う方法を誰かに教えていただければ幸いです。

入力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:ID>
                           <NS2:IDValue>01018</NS2:IDValue>
                           <NS2:IDQualifier>95</NS2:IDQualifier>
                           <NS2:IDRegion>SCA</NS2:IDRegion>
                            <NS2:IDState>CA</NS2:IDState>
                        </NS2:ID>
                        <NS2:ID>
                           <NS2:IDValue>01019</NS2:IDValue>
                           <NS2:IDQualifier>96</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:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:tns="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="tns:*">
        <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>

必要な出力:

<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:ID>
                           <NS2:IDValue>01018</NS2:IDValue>
                           <NS2:IDQualifier>95</NS2:IDQualifier>
                           <NS2:IDRegion>SCA</NS2:IDRegion>
                            <NS2:IDState>CA</NS2:IDState>
                        </NS2:ID>
                            </NS2:Identification>
                             </NS2:Pharmacy>
                    </NS2:New>
                     </NS2:Identification>
                  </NS2:Pharmacy>
               </NS2:New>
            </NS2:Body>
         </NS2:Message>
      </tns:send>
   </soapenv:Body>
</soapenv:Envelope>

XSLTを適用した後に期待する2番目のバリエーションは、文字列をトリミングすることです。IDインスタンスのIDRegionは3文字ですが、XSLTを適用した後、2文字の「SC」にトリミングしたいと思います。

したがって、次のような出力

<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>SC</NS2:IDRegion>
                               <NS2:IDState>CA</NS2:IDState>
                            </NS2:ID>
                            <NS2:ID>
                               <NS2:IDValue>01018</NS2:IDValue>
                               <NS2:IDQualifier>95</NS2:IDQualifier>
                               <NS2:IDRegion>SC</NS2:IDRegion>
                                <NS2:IDState>CA</NS2:IDState>
                            </NS2:ID>
                                </NS2:Identification>
                                 </NS2:Pharmacy>
                        </NS2:New>
                         </NS2:Identification>
                      </NS2:Pharmacy>
                   </NS2:New>
                </NS2:Body>
             </NS2:Message>
          </tns:send>
       </soapenv:Body>
    </soapenv:Envelope>
4

1 に答える 1

1

この変換(XSLT1.0とXSLT2.0の両方):

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:NS2="http://www.ncpdp.org/schema/SCRIPT">
 <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="NS2:ID[position() > 2]"/>
</xsl:stylesheet>

提供された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:ID>
                                    <NS2:IDValue>01018</NS2:IDValue>
                                    <NS2:IDQualifier>95</NS2:IDQualifier>
                                    <NS2:IDRegion>SCA</NS2:IDRegion>
                                    <NS2:IDState>CA</NS2:IDState>
                                </NS2:ID>
                                <NS2:ID>
                                    <NS2:IDValue>01019</NS2:IDValue>
                                    <NS2:IDQualifier>96</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>

必要な正しい結果を生成します

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
   <soapenv:Body>
      <tns:send xmlns:tns="http://www.test.com/Service/v3">
         <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:ID>
                           <NS2:IDValue>01018</NS2:IDValue>
                           <NS2:IDQualifier>95</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>

説明

IDルールの適切な使用とオーバーライド。

更新

コメントで、OPは新しい要件を追加しました。それぞれNS2:IDRegionを2文字に切り捨てる必要があります。

新しい要件を実装する更新された変換は次のとおりです。

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"  
 xmlns:NS2="http://www.ncpdp.org/schema/SCRIPT">
 <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="NS2:IDRegion/text()">
      <xsl:value-of select="substring(.,1,2)"/>
    </xsl:template>
    <xsl:template match="NS2:ID[position() > 2]"/>
</xsl:stylesheet>

この変換が同じ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 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>SC</NS2:IDRegion>
                           <NS2:IDState>CA</NS2:IDState>
                        </NS2:ID>
                        <NS2:ID>
                           <NS2:IDValue>01018</NS2:IDValue>
                           <NS2:IDQualifier>95</NS2:IDQualifier>
                           <NS2:IDRegion>SC</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>
于 2012-10-18T18:45:22.003 に答える