2017-07-20 10 views
0

APIの統合中に、タグの値が特定の文字列に一致する最初のオカレンスを選択しようとしており、残りのすべてを割り引いています。値の特定の出現のためのXSLT変換

以下は、私が持っているコードのスニペットです。むしろ第二出現より、以下に示すような情報を取得 -

<Body> 
<Envelope> 
<GetCollectionResponse> 
<GetCollectionResult> 
    <ErrorCode>0</ErrorCode> 
    <Collections> 
     <Collection> 
      <Service>Service One</Service> 
      <Day>Tuesday</Day> 
      <Date>18/07/2017</Date> 
     </Collection> 
     <Collection> 
      <Service>Service Two</Service> 
      <Day>Wednesday</Day> 
      <Date>19/07/2017</Date> 
     </Collection> 
     <Collection> 
      <Service>Service One</Service> 
      <Day>Thursday</Day> 
      <Date>20/07/2017</Date> 
     </Collection> 
    </Collections> 
</GetCollectionResult> 
</GetCollectionResponse> 
</Envelope> 
</Body> 

理想的には、私は、サービスが一致する「サービスワン」となる最初の発生をフェッチすることを希望します。

<Service>Service One</Service 
<Day>Tuesday</Day> 
<Date>18/07/2017</Date> 

ご協力いただければ幸いです。

答えて

0

XSLTのvalue-of要素を使用できます。これは、XPathに一致する最初の要素を取得します。説明と例を参照してください:私はそれをしたいと思い、

<xsl:value-of select="/Body/Envelope/GetCollectionResponse/GetCollectionResult/Collections/Collection[Service='Service One']/Day"/> 

と理想的にあなたの日付

+0

ここでやったようなことをお勧めしますか? https://justpaste.it/1959o –

+0

最初の値が「はい」の場合は、修正してください。選択した両方の値が印刷されます。 w3Schoolの「自分で試してみる」エディタは、あなたがテストするのに非常に適しています。 –

+0

この例では、それぞれのフィールドの値が変更されています。上記のリンク先のコードを使用すると、私のデータセットから結果が得られませんでした。 私はXSLTの新機能であるため、XSLTの "*' value-of要素である –

1

の等価:https://www.w3schools.com/xml/xsl_value_of.asp

あなたのXPathは、日の値を取得するために、次のようなものかもしれません サービスが 'サービス1'と一致します。

出力が十分でないこと

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 
<xsl:strip-space elements="*"/> 

<xsl:template match="/Body"> 
    <!-- "the first occurence whereby the Service matches 'Service One'" is: --> 
    <xsl:variable name="my-service" select="Envelope/GetCollectionResponse/GetCollectionResult/Collections/Collection[Service='Service One'][1]"/> 
    <!-- output --> 
    <xsl:copy-of select="$my-service/Service"/> 
    <xsl:copy-of select="$my-service/Day"/> 
    <xsl:copy-of select="$my-service/Date"/> 
</xsl:template> 

</xsl:stylesheet> 

注:TこのServiceから複数のノードは、その後、個々の要素を得るためにそれを使用して、最初の変数に配置すると便利かもしれません形式のXML(単一のルート要素はありません)。もちろん


、与えられた例では、あなたがこれを短縮することができます:選択したServiceのすべての子要素を取得するために

<xsl:template match="/Body"> 
    <xsl:copy-of select="Envelope/GetCollectionResponse/GetCollectionResult/Collections/Collection[Service='Service One'][1]/*"/> 
</xsl:template>