2017-03-02 15 views
-2

私は以下のメッセージを変数に入れました。メッセージから特定の部分文字列を読み取るXSLT-1.0

7c
 {"code":3001,"message":"issued"}
 0
 
 

Iは、XSLTを使用して起動メッセージを利用したい「{」で終わる「}」であろう。私はsub-string()starts-with関数を使ってみましたが、成功しませんでした。

私の最後のアウトプットが

でなければなりません

あなたが処理するため、内部matching-substringanalyze-stringを使用することができXSLT 2.0で

+1

あなたのコードを最初から書き直すのではなく、修正できるように、あなたの試行を投稿してみませんか? XSLT 1.0または2.0を使用している場合も記述します。 –

+0

私はXSLT 1.0を使用していますが、サブストリングを試してみましたが、その前に '{'と '}'の後ろにテキストを入力しましたが、jsonresponse [starts-with(。、 '{')]テキストは '}'で終わります。 – techq

+0

あなたの質問には答えられませんか? –

答えて

1

{ "コード": "発行":3001、 "メッセージ"}キャプチャされた正規表現

例に移りましょう。下記のソースXMLを開始します。

<?xml version="1.0" encoding="UTF-8"?> 
<main> 
    <message>7c {"code":3001,"message":"issued"} 0</message> 
</main> 

はその後、我々は、このようなXSLTを使用することができます。

<?xml version="1.0" encoding="UTF-8" ?> 
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"> 
    <xsl:output method="xml" encoding="UTF-8" indent="yes" /> 

    <xsl:template match="message"> 
    <xsl:copy> 
     <xsl:analyze-string select="." regex="\{{(.*)\}}"> 
     <xsl:matching-substring> 
      <xsl:value-of select="regex-group(1)"/> 
     </xsl:matching-substring> 
     </xsl:analyze-string> 
    </xsl:copy> 
    </xsl:template> 

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

regex属性の内容。 XSLT中括弧で

  • 属性値テンプレートからそれらを区別するために倍増しなければなりません。
  • しかし、これらの中括弧は、すなわち私たちが(彼らは、先行する正規表現のための繰り返し カウントの区切り文字として、ここではない)だけ{}文字のため を探している、ここでリテラル中括弧です。このため、それぞれに の前にバックスラッシュを付ける必要があります。
  • これらの中括弧の間に、キャプチャグループ(...)があります。
  • 以下のregex-group(1)のキャプチャされたグループの内容を参照してください。

必要に応じて、メッセージの各部分を の部分をキャプチャして使い分けるために、キャプチャグループを正規表現に追加することができます。あなたが本当にXSLT 1.0に限定されている場合

は、しかし、あなたがすることができます:substring-beforeから後}、すべてを遮断する

  • スタート。
  • 次に、substring-afterを使用して、{とそれ以前のすべてを切断します。

と中括弧を囲むのテキストが必要なのでしょうか? concatを使用して、{の前に追加し、}を追加します。

+0

ありがとうございました、あなたの助けを感謝します! – techq

1

が、私はサブ-後、あなたがXSLT 1.0を使用している場合はその前に、私に

「{」の前と 「}」の後のテキストを与えてみました、そして正確に行うには、行方不明を追加テキストとしてセパレータ - 例えば:

<xsl:variable name="var">7c {"code":3001,"message":"issued"} 0 </xsl:variable> 

<xsl:text>{</xsl:text> 
<xsl:value-of select="substring-before(substring-after($var, '{'), '}')"/> 
<xsl:text>}</xsl:text> 

リターン:

{"code":3001,"message":"issued"} 

XSLT 2.0では、あなたは、単に行うことができます:

<xsl:value-of select="replace($var, '.*(\{.*\}).*', '$1')"/> 

は、同じ結果を得るために。

関連する問題