2017-03-02 62 views
-2

我在變量中的消息下面。XSLT-1.0從消息中讀取特定的子字符串

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

我想借此以「{」和結尾「}」使用XSLT該消息。我嘗試使用sub-string()starts-with函數,但沒有成功。

我最後出來放應

{ 「代碼」:3001, 「消息」: 「頒發的」}

+1

爲什麼不發佈您的嘗試,以便我們可以修復它,而不必從頭開始爲您編寫代碼。同時說明如果使用XSLT 1.0或2.0。 –

+0

我正在使用XSLT 1.0,我試過子串 - 之後和之前給我的文字'{'之前'}',我也看到jsonresponse [開始與(。,'{')],但不知道如何以'}'結尾文本。 – techq

+0

你的問題沒有回答? –

回答

1

在XSLT 2.0,你可以使用analyze-stringmatching-substring內,處理被捕獲的正則表達式

我們來看一個例子。先從下面給出源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')"/> 

得到相同的結果。

相關問題