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>