我在變量中的消息下面。XSLT-1.0從消息中讀取特定的子字符串
7c {"code":3001,"message":"issued"} 0
我想借此以「{」和結尾「}」使用XSLT該消息。我嘗試使用sub-string()
和starts-with
函數,但沒有成功。
我最後出來放應
{ 「代碼」:3001, 「消息」: 「頒發的」}
我在變量中的消息下面。XSLT-1.0從消息中讀取特定的子字符串
7c {"code":3001,"message":"issued"} 0
我想借此以「{」和結尾「}」使用XSLT該消息。我嘗試使用sub-string()
和starts-with
函數,但沒有成功。
我最後出來放應
{ 「代碼」:3001, 「消息」: 「頒發的」}
在XSLT 2.0,你可以使用analyze-string
與matching-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
屬性的內容。
{
和}
字符尋找 (他們不是這裏重複的分隔符 計數前面的正則表達式)。出於這個原因,我們必須在它們的每一個之前加上反斜槓 。(...)
。regex-group(1)
中捕獲的組的內容。如果你需要,你可以把更多的捕獲組在正則表達式,捕捉消息的 各個部分,然後做一些使用它們。
但是,如果你真的僅限於XSLT 1.0,您可以:
substring-before
切斷後}
和一切。substring-after
來切斷{
以及之前的所有內容。或者您可能需要文字與圍繞大括號? 然後使用concat
預先設定{
並追加}
。
謝謝大家,感謝您的幫助! – techq
我試圖子-後,給我「{」前和 「}」
之後文本之前它如果您使用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')"/>
得到相同的結果。
爲什麼不發佈您的嘗試,以便我們可以修復它,而不必從頭開始爲您編寫代碼。同時說明如果使用XSLT 1.0或2.0。 –
我正在使用XSLT 1.0,我試過子串 - 之後和之前給我的文字'{'之前'}',我也看到jsonresponse [開始與(。,'{')],但不知道如何以'}'結尾文本。 – techq
你的問題沒有回答? –