2016-08-18 4 views
1

初めてxsltの作成を扱っていますが、これは本当に面倒です。XML用のxsltの作成に困難があります

私はXMLをリクエストしており、xsltを使用すると、下記のo/pでXMLを生成することになっています。

この操作を実行するユーティリティは、すでにC#で構築されています。 XMLから値を正しく読み取り、期待される形式の新しいXMLを作成するXSLTを作成する必要があります。私は、XMLを変換するためにXSLTを記述しようとしています

(I/P):

<s:Envelope xmlns:a="http://www.w3.org/2005/08/addressing" 
    xmlns:s="http://www.w3.org/2003/05/soap-envelope"> 
    <s:Body> 
     <ExecuteESI xmlns="http://TTTT.com/Enterprise/ServiceGateways/"> 
      <context xmlns:b="http://TTTT.com/Enterprise/ServiceGateways/Core/Contracts/" 
       xmlns:i="http://www.w3.org/2001/XMLSchema-instance"> 
       <request xmlns:b="http://TTTT.com/Enterprise/ServiceGateways/ExternalService/Request/" 
        xmlns:i="http://www.w3.org/2001/XMLSchema-instance"> 
        <b:Message> 
         <ns2:ReqProv xmlns:ns2="http://TTTT.com/TTTT/TTTTestJSONESIRequest/"> 
          <ns2:CID>TTTT</ns2:CID> 
          <ns2:TIME>18732081720160855</ns2:TIME> 
          <ns2:HASH>40dad29c4ae9303c975639f7700bf517e6e72fbf5723c7905a74fde0d5452da0</ns2:HASH> 
         </ns2:ReqProv> 
        </b:Message> 
       </request> 
      </context> 
     </ExecuteESI> 
    </s:Body> 
</s:Envelope> 

下記フォーマット(O/P)には:

<?xml version="1.0" encoding="UTF-8"?> 
<string xmlns="http://schemas.microsoft.com/2003/10/Serialization/">CID=TTTT&amp;TIME=18732081720160855&amp;HASH=40dad29c4ae9303c975639f7700bf517e6e72fbf5723c7905a74fde0d545</string> 

私は、次のXSLTを、書かれています私は<xsl:value-of...<xsl:template match...のさまざまな組み合わせを試してみました

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet version="1.0" 
       xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
       xmlns:msxsl="urn:schemas-microsoft-com:xslt" 
       xmlns:ns="http://asurion.com/TTTT/TTTTTestJSONESIRequest/" 
       xmlns="http://schemas.microsoft.com/2003/10/Serialization/" 
       exclude-result-prefixes="msxsl xsl ns"> 
    <xsl:output method="xml" /> 
    <xsl:template match="/"> 

    <xsl:variable name="CID"> 
     <xsl:value-of select="./ns:ReqProv/ns:CID"/> 
    </xsl:variable> 
    <xsl:variable name="TIME"> 
     <xsl:value-of select="./ns:ReqProv/ns:TIME"/> 
    </xsl:variable> 
    <xsl:variable name="HASH"> 
     <xsl:value-of select="./ns:ReqProv/ns:HASH"/> 
    </xsl:variable> 

    CID=<xsl:value-of select="$CID" />&amp;TIME=<xsl:value-of select="$TIME" />&amp;HASH=<xsl:value-of select="$HASH" /> 

    </xsl:template> 

</xsl:stylesheet> 

を動作しません。と<xsl:template name....が動作するようだ。

+0

必要な出力を転記してください。 –

+0

''と組み合わせて[concat()関数](http://stackoverflow.com/q/10395488/205233)を使用すると、望ましい結果が得られます。 BTW:SOAPサービスの応答のようなものですから、実際には変換されたXMLが必要ですか、単に応答全体を逆シリアル化してプロパティにアクセスして目的の文字列を取得できませんでしたか? – Filburt

+1

@RudramuniTP OPは既に*以下の形式* – Filburt

答えて

1

ことは、これを試してみてください:

<xsl:stylesheet version="1.0" 
      xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
      xmlns:msxsl="urn:schemas-microsoft-com:xslt" 
      xmlns:ns="http://asurion.com/TTTT/TTTTTestJSONESIRequest/" 
      xmlns="http://schemas.microsoft.com/2003/10/Serialization/" 
      xmlns:s="http://www.w3.org/2003/05/soap-envelope" 
      xmlns:ns2="http://TTTT.com/TTTT/TTTTestJSONESIRequest/" 
      exclude-result-prefixes="msxsl xsl ns"> 
<xsl:output method="xml" /> 
<xsl:template match="/"> 

<xsl:variable name="CID"> 
    <xsl:value-of select="//ns2:ReqProv/ns2:CID"/> 
</xsl:variable> 
<xsl:variable name="TIME"> 
    <xsl:value-of select="//ns2:ReqProv/ns2:TIME"/> 
</xsl:variable> 
<xsl:variable name="HASH"> 
    <xsl:value-of select="//ns2:ReqProv/ns2:HASH"/> 
</xsl:variable> 

<xsl:element name="string">CID=<xsl:value-of select="$CID" />&amp;TIME=<xsl:value-of select="$TIME" />&amp;HASH=<xsl:value-of select="$HASH" /></xsl:element> 

</xsl:template> 

</xsl:stylesheet> 

はプットのxml NS2に要素CIDの名前空間である、ので

<xsl:value-of select="//ns2:ReqProv/ns2:CID"/> 

<xsl:value-of select="./ns:ReqProv/ns:CID"/> 

を変更する必要があります。

出力:

<string xmlns="http://schemas.microsoft.com/2003/10/Serialization/">CID=TTTT&amp;TIME=18732081720160855&amp;HASH=40dad29c4ae9303c975639f7700bf517e6e72fbf5723c7905a74fde0d5452da0</string> 
+0

ありがとうございます。これはうまくいきました – VishalP

1

あなたはほとんどそこにいます。スタイルシートテンプレートに<string>結果要素を指定し、XPath式を修正し、不一致の名前空間URIを修正する必要があります。

あなたは次のように"/"に一致するテンプレートを変更したいと思う:

<xsl:template match="/"> 
    <!-- No need to use value-of here. 
    Also use .// instead of ./, because ns:ReqProv is not a child of /. --> 
    <xsl:variable name="CID" select=".//ns:ReqProv/ns:CID"/> 
    <xsl:variable name="TIME" select=".//ns:ReqProv/ns:TIME"/> 
    <xsl:variable name="HASH" select=".//ns:ReqProv/ns:HASH"/> 

    <string>CID=<xsl:value-of select="$CID" />&amp;TIME=<xsl:value-of select="$TIME" />&amp;HASH=<xsl:value-of select="$HASH" /></string> 

    </xsl:template> 

あなたはまた、彼らが一致するように、入力XMLには、これら2つの名前空間URIの1つを変更する必要があり、 XSLT:

"http://TTTT.com/TTTT/TTTTestJSONESIRequest/" 

"http://asurion.com/TTTT/TTTTTestJSONESIRequest/" 

私はguessinよこれらは実際の入力XMLとXSLTでは実際と同じですが、ここで質問を投稿する際に変更しました。だからあなたはそれらが一致することを確認したいと思うでしょう。

+0

あなたは正しいです。ありがとう – VishalP

2

あなたの試みには数多くの問題があります。最も重大なものは間違った名前空間を使用しています。代わりにお試しください:

XSLT 10

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:ns="http://TTTT.com/TTTT/TTTTestJSONESIRequest/" 
xmlns="http://schemas.microsoft.com/2003/10/Serialization/" 
exclude-result-prefixes="ns"> 
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 

<xsl:template match="/"> 
    <string> 
     <xsl:text>CID=</xsl:text> 
     <xsl:value-of select="//ns:ReqProv/ns:CID"/> 

     <xsl:text>@amp;TIME=</xsl:text> 
     <xsl:value-of select="//ns:ReqProv/ns:TIME"/> 

     <xsl:text>@amp;HASH=</xsl:text> 
     <xsl:value-of select="//ns:ReqProv/ns:HASH"/> 
    </string> 
</xsl:template> 

</xsl:stylesheet> 

:あなたは一度だけ必要があるもののための変数を定義する上で非常に少ない点がありまし

  • リテラルテキストを出力するときは、xsl:text命令を使用する方がずっと便利です。コードを読みやすく保守しやすくなります。

+0

読者の第2の要点を明確にするために、 'xsl:text'命令は、行末の文字がテンプレート出力(結果)の一部にならずに、複数の行にあなたのXSLTテンプレートを書式設定することを可能にします。したがって、結果を1行だけにしたい場合でも、XSLTコードを1行にまとめることなく、たくさんのXSLTコードを組み合せることができます。 – LarsH

+0

値が1回だけ必要な変数を定義しても、処理時間やコード長は保存されません。しかし、場合によっては、変数によって指定された特定の値がどのようなもので構成されているかが文書化されているため、コードを読みやすく保守しやすくなります。また、出力書式(変数が使用されている場所)と入力書式との分離を助けることもできます。そして、それらの変更の1つがあれば、2つが混在していないので、コードを更新する方が簡単です。私は、このケースでは変数を使う方が良いと言っているわけではありません。ちょうどそれはしばしば有効な選択肢です。 – LarsH